[Scala] 快学Scala A3L3
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的更多相关文章
- [Scala] 快学Scala A2L2
集合 13.1 集合的三大类 所有的集合都扩展Iterable特质.集合的三大集合为Seq, Set, Map Seq是一个有先后次序的值的序列,比如数组或列表.IndexSeq允许我们通过整型下表快 ...
- [Scala] 快学Scala A1L1
基础 1.1 声明值和变量 在Scala中,鼓励使用val; 不需要给出值或变量的类型,这个信息可以从初始化表达式推断出来.在必要的时候,可以指定类型. 在Scala中,仅当同一行代码中存在多条语句时 ...
- 快学Scala习题解答—第一章 基础
1 简介 近期对Scala比较感兴趣,买了本<快学Scala>,感觉不错.比<Programming Scala:Tackle Multi-Core Complexity on th ...
- 《快学Scala》
Robert Peng's Blog - https://mr-dai.github.io/ <快学Scala>Intro与第1章 - https://mr-dai.github.io/S ...
- 快学Scala 第十九课 (trait的abstract override使用)
trait的abstract override使用: 当我看到abstract override介绍的时候也是一脸懵逼,因为快学scala,只介绍了因为TimestampLogger中调用的super ...
- Scala快学笔记(二)
一,基本概念 1,映射 Map与HashMap与TreeMap,SotredMap等区别: 1.HashMap键无序,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度 ...
- 快学Scala第一部分
转载: 1.变量声明 val answer = 8 * 5 + 2; //常量 var counter = 0; //变量 //在必要的时候 ,可以指定类型 val greeting:Strin ...
- 快学scala
scala 1. scala的由来 scala是一门多范式的编程语言,一种类似java的编程语言[2] ,设计初衷是要集成面向对象编程和函数式编程的各种特性. java和c++的进化速度已经大不如 ...
- 快学Scala 第二课 (apply, if表达式,循环,函数的带名参数,可变长参数,异常)
apply方法是Scala中十分常见的方法,你可以把这种用法当做是()操作符的重载形式. 像以上这样伴生对象的apply方法是Scala中构建对象的常用手法,不再需要使用new. if 条件表达式的值 ...
随机推荐
- 用alarmmanager 多次发送PendingIntent
遇到如下问题 service中得一随机数 用alarmmanager 发送PendingIntent的时候,receiver收到的随机数不变. pendingintent传值经常获取到的值是第一次的值 ...
- 深入理解C++对象模型
C++对象模型是比较重要的一个知识点,学习C++对象的内存模型,就可以明白C++中的多态原理.类的初始化顺序问题.类的大小问题等. 1 C++对象模型基础 1.1 C++对象中都有哪些东东 C++对象 ...
- Linux Kernel代码艺术——系统调用宏定义
我们习惯在SI(Source Insight)中阅读Linux内核,SI会建立符号表数据库,能非常方便地跳转到变量.宏.函数等的定义处.但在处理系统调用的函数时,却会遇到一些麻烦:我们知道系统调用函数 ...
- Windows+Linux----打造和谐的开发环境
其实Windows和Linux并非水火不容,相反,我觉得,如果将二者结合起来,取长补短,便可打造一个华丽.实用的开发环境. 吾以为,不会用linux的人,不能称为一个程序猿,但是一味觉得Linux很吊 ...
- GNU make使用变量⑤变量的引用、定义等
在 Makefile 中,变量是一个名字(像是 C 语言中的宏),代表一个文本字符串(变量的值).在 Makefile 的目标.依赖.命令中引用变量的地方,变量会被它的值所取代(与 C 语言中宏引用的 ...
- sql left join on
select sysuser.userid, sysuser.groupid, sysuser.sysid, nvl( userjd.mc,nvl(useryy.m ...
- [No00006C]文件名复制,归档小助手【自己写的小工具,希望能帮助大家】
特别补充一句:软件可以一次性复制多个文件的文件名. Windows 中的复制文件名实在是有些不方便 ,需要点右键 "重命名"之后再点右键选择"复制"才可复制文件 ...
- Nginx Rewrite规则
location = / { # 精确匹配 / ,主机名后面不能带任何字符串 [ configuration A ] } location / { # 因为所有的地址都以 / 开头,所以这条规则将匹配 ...
- SSH加固
1.修改ssh默认端口 vi /etc/ssh/sshd_config 中Port:service ssh restart 2.安装denyhosts,应对暴力破解ssh. A.直接 apt-get ...
- 分形之概率学下的green tree
今天做的是分形之随机概率,可以和以前做的那个抛色子的做法非常相似,抛色子是用随机点数控制图形,今天做的树叶图形只是用概率的做法去控制图形而已,做法是如出一辙的: //图形界面 package ...