Actor

通过尽可能避免锁和共享状态,actor使得我们能够容易地设计出正确、没有死锁或争用状况的程序。

Scala类库提供了一个actor模型的简单实现。AKKA是更高级的actor类库。

19.1 发送消息

actor是一个处理异步消息的对象。消息可以是任何对象。一个好的做法是使用样例类作为消息,这样就可以使用模式匹配来处理消息。

消息的发送是异步的:“发完就忘”。消息被送往目标actor,当前线程继续运行。

19.2 接收消息

发送到actor的消息被存在“邮箱”中。receive方法从邮箱获取下一条消息并将它传递给它的参数,该参数是一个偏函数。

邮箱中没有消息可以处理,receive方法会阻塞。

19.3 向其他actor发送消息

不同actor之间不应该共享状态。总是使用消息来发送消息

避免同步消息

隐式转换和隐式参数

20.1 隐式转换

隐式转换函数(implicit conversion function)指的是那种以implicit关键字声明的带有单个参数的函数。比如:

implicit def int2Fraction(n: Int) = Fraction(n, 1);

val result = 3 * Fraction(4, 5)  //3会隐式转换成Fraction(3, 1)

隐式转换函数可以起任意名,由于你不显示地调用它。不过建议以 source2target这样约定俗成的命名方式

*利用隐式转换丰富现有类库的功能,比如:RichInt,需要同时实现RichInt和一个隐式转化函数!

20.2 引入隐式转换

Scala会考虑如下的隐式转换函数:

  • 位于源或目标类型的伴生对象中的隐式函数
  • 位于当前作用域可以以单个标识符指代的隐式函数(object中?)

*隐式转换根据实际调用情况发生。将引入局部化以尽量避免不想要的转换发生。

20.3 隐式参数

函数或方法可以带有一个标记为implicit的参数列表。这种情况下,编译器会查找缺省值,提供给该函数或方法。

例如:quote(what: String)(implicit delims: Delimiters) = delims.left + what + delims.right

如果调用时略去隐式参数列表:quote("Bonjour le monde"),这种情况下,编译器会找一个类型为Delimiters的隐式值。这必须是一个被声明为implicit的值。编译器会在如下两个地方查找这样的一个对象:

  • 当前作用域所有可以用单个标识符指代的满足类型要求的val和def
  • 与所有要求类型相关联的伴生对象。

20.4 利用隐式参数进行隐式转换

当隐式的参数是函数类型时,我们还可以利用隐式参数进行饮食转换。比如

def smaller[T](a: T, b: T)(implicit order: T => Ordered[T]) if(order(a) < b) a else b

20.5 implicitNotFound注解

该注解告诉编译器在不能构造出带有该注解的类型的参数时给出错误提示。例如:

@implicitNotFound(msg="Cannot prove that ${From} <:< ${To}")

[Scala] 快学Scala A3L3的更多相关文章

  1. [Scala] 快学Scala A2L2

    集合 13.1 集合的三大类 所有的集合都扩展Iterable特质.集合的三大集合为Seq, Set, Map Seq是一个有先后次序的值的序列,比如数组或列表.IndexSeq允许我们通过整型下表快 ...

  2. [Scala] 快学Scala A1L1

    基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...

  3. 快学Scala习题解答—第一章 基础

    1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on th ...

  4. 《快学Scala》

    Robert Peng's Blog - https://mr-dai.github.io/ <快学Scala>Intro与第1章 - https://mr-dai.github.io/S ...

  5. 快学Scala 第十九课 (trait的abstract override使用)

    trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super ...

  6. Scala快学笔记(二)

    一,基本概念 1,映射 Map与HashMap与TreeMap,SotredMap等区别: 1.HashMap键无序,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度 ...

  7. 快学Scala第一部分

    转载: 1.变量声明 val answer = 8 * 5 + 2; //常量 var counter = 0;    //变量 //在必要的时候 ,可以指定类型 val greeting:Strin ...

  8. 快学scala

    scala 1.   scala的由来 scala是一门多范式的编程语言,一种类似java的编程语言[2] ,设计初衷是要集成面向对象编程和函数式编程的各种特性. java和c++的进化速度已经大不如 ...

  9. 快学Scala 第二课 (apply, if表达式,循环,函数的带名参数,可变长参数,异常)

    apply方法是Scala中十分常见的方法,你可以把这种用法当做是()操作符的重载形式. 像以上这样伴生对象的apply方法是Scala中构建对象的常用手法,不再需要使用new. if 条件表达式的值 ...

随机推荐

  1. Caffe 单独测试添加的layer

    转载请注明出处,楼燚(yì)航的blog,http://home.cnblogs.com/louyihang-loves-baiyan/ 一般我们在使用Caffe的时候,可能需要根据自己的任务需求添加 ...

  2. Android与Struts2简单json通信

    具体要求是: 服务器端得到客户端传递来的数据,并返回给客户端一条json格式的字符串 闲话不多说,直接上代码 首先是服务器端代码:建立一个web工程,导入struts2和json的jar包,并在web ...

  3. Unity 下载存档

    各种版本的UNITY下载 https://unity3d.com/cn/get-unity/download/archive

  4. Java的泛型反射

    If the superclass is a parameterized type, the {@code Type} * object returned must accurately reflec ...

  5. linux 下 sudo 指令不需要输入密码的配置

    sudo的配置文件位于 /etc/sudoers 里面.具体操作如下: 打开sudoers文件. bo@engineer ~/ $ sudo nano /etc/sudoers 假定你的用户名为  m ...

  6. BZOJ 2034 【2009国家集训队】 最大收益

    Description 给出\(N\)件单位时间任务,对于第\(i\)件任务,如果要完成该任务,需要占用\([S_i, T_i]\)间的某个时刻,且完成后会有\(V_i\)的收益.求最大收益. 澄清: ...

  7. bzoj 1334: [Baltic2008]Elect

    Description N个政党要组成一个联合内阁,每个党都有自己的席位数. 现在希望你找出一种方案,你选中的党的席位数要大于总数的一半,并且联合内阁的席位数越多越好. 对于一个联合内阁,如果某个政党 ...

  8. 点击弹出li所在的序列号

    最近在研究一个图片替换功能,及点击左侧商品在右侧弹出层修改图片后,同时左侧的图片也得跟着修改. 我原来考虑的添加ID作为唯一值.但当ID重复了,替换就出BUG了. 最后问公司同事,然后给提供了 根据点 ...

  9. Angularjs+node+Mysql实现地图上特定点的定位以及附加信息展示

    注:本博文为博主原创,转载请注明出处. 在上一篇博文中主要讲述了如何利用AngularJs+Node+MySql构建项目,并实现地图上的多点标注,今天在这篇文章中,我们将在上一个项目的基础上,实现特定 ...

  10. JavaScript语法规范

    推荐的JavaScript编码规范 阅读 247 评论 0 喜欢 0 作为前端开发人员,我相信每一个人都或多或少的用到原生的JavaScript,也正是因为用的人多,导致编码风格也是多种多样的,而不规 ...