[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 条件表达式的值 ...
随机推荐
- 【小白的CFD之旅】01 引子
小白的CFD之旅 写在前面 CFD是计算流体力学的英文简称,是计算机辅助工程(CAE)的主要分支,目前广泛应用与科学研究.工程设计中.这是一门综合了数学.计算机及流体力学的综合学科,涉及到众多的专业理 ...
- [转]ASP.NET Core 之 Identity 入门(一)
本文转自:http://www.cnblogs.com/savorboard/p/aspnetcore-identity.html 前言 在 ASP.NET Core 中,仍然沿用了 ASP.NET里 ...
- mybatic与spring结合的事务管理
原文地址:http://czj4451.iteye.com/blog/2037759 mybatis与spring结合后,事务管理更加方便,这里介绍使用transactionnal的方式,有错的的地方 ...
- libsvm简介和函数调用参数说明
1. libSVM简介 libSVM是台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机库,这套库运算速度挺快,可以很方便的对数据做分类或回归.由于libSVM程序小 ...
- COGS 265线段覆盖[线段树]
265. 线段覆盖 ★★☆ 输入文件:xdfg.in 输出文件:xdfg.out 简单对比时间限制:2 s 内存限制:20 MB [问题描述] 有一根长度为 L 的白色条状物.有两种操 ...
- python使用you-get模块下载视频
pip install you-get # 安装先 怎么用 进入命令行: you-get url 暂停下载:ctrl + c ,继续下载重复 you-get url 官网地址:https:// ...
- MySql 存储过程、触发器和权限问题
存储过程 1.1 什么是存储过程 存储过程,带有逻辑的sql语句 之前的sql没有条件判断,没有循环 存储过程带上流程控制语句(if while) 1.2 存储过程特点 1)执行效率非常快!存储过程 ...
- js鼠标事件大全
一般事件 事件 浏览器支持 描述 onClick HTML: 2 | 3 | 3.2 | 4 Browser: IE3 | N2 | O3 鼠标点击事件,多用在某个对象控制的范围内的鼠标点击 onDb ...
- php面向对象编程(一)
类与对象关系: 类就像一个人类的群体 我们从类中实例化一个对象 就像是制定一个人. 面向对象程序的单位就是对象,但对象又是通过类的实例化出来的,所以我们首先要做的就是如何来声明类, 做出来一个类很容易 ...
- redis-windows免安装版本安装多个redies
1.复制两份redis:端口分别为6369和6379 2.修改端口 6379为redis默认的端,不改; 进入6369的下面找到如下配置文件: redis.conf 修改端口 然后分别启动redis- ...