去掉Scala的糖衣(4) -- Type Aliase
我的新博客地址:http://cuipengfei.me/blog/2013/12/23/desugar-scala-4/
Scala中有一个type关键字,用来给类型或者是操作起别名,用起来很是方便。
比如这样:
1 |
|
这样就是给List[Person](方括号是Scala的类型参数的写法)声明了一个别名,叫做People。
接下来就可以这样使用它:
1 |
|
这个代码编译之后没有什么神奇的,仅仅是把所有出现People这个字眼的地方都用List of Person替代了。
1 |
|
这种给类型一个别名的特性只是一个小糖豆,不太甜,真正有趣的是给一类操作命名(联想C#中定义delegate)。
比如这样:
1 |
|
接受一个Person,返回一个Boolean,我们把这一类用来判断一个人是否符合某个条件的操作统称为PersonPredicate。
然后我们可以定义以下predicate:
1 |
|
然后前面写过的teenagers方法就可以这样重新定义:
1 |
|
按照这个思路下去,我们就可以开始composite functions了。比如说,我们跟人收税,就可以这么做:
1 |
|
从一个人那里拿到钱,这种操作,我们称之为Tax。然后定义个税和苛捐杂税,或者也可以有任意多的税种。
然后就可以把任意的几个税种放在一个List里面,和calculateTax去composite了。
当然,没有type这个关键字,我们也可以composite functions。只不过就得写成这样:
1 |
|
看着稍微有点眼花。
这种用type关键字给一种操作命名的代码反编译之后是这样的:
1 |
|
可以看到所有这种接受一个参数,返回一个值的操作都是Function1<Person, Object>。
推测一下,接受两个参数,返回一个值的是不是该叫做Function2呢?
1 |
|
反编译之后,果不其然:
1 |
|
那不接收参数,只有返回值的呢?
1 |
|
反编译之后,其实是变成了Function0 of String:
1 |
|
到这里,我们可以总结一下type alia这个糖衣:
一个类型的type alias,类似于这样的:type t = x。编译器将在所有使用到t的地方把t替换为x。
对于一种操作的type alias,编译器将会根据参数列表和返回值类型的不同将其替换为对应的Function0,Function1,Function2 …… 一直到Function22。
如果我们真的定义一个超过二十二个参数的操作会如何呢?
1 |
|
Scala编译器会直接告诉我们: type Function23 is not a member of package scala
去掉Scala的糖衣(4) -- Type Aliase的更多相关文章
- 测试驱动 ASP.NET MVC Type Aliase
Type Aliase 去掉Scala的糖衣(4) -- Type Aliase 我的新博客地址:http://cuipengfei.me/blog/2013/12/23/desugar-scala- ...
- 抹掉Scala的糖衣(14) -- Update Method
欢迎关注我的新博客地址:http://cuipengfei.me/ 在Scala中,名字叫做update的方法是有特殊作用的. 比如: 1 2 3 val scores = new scala.col ...
- 除去Scala的糖衣(13) -- Default Parameter Value
欢迎关注我的新博客地址:http://cuipengfei.me/ 好久没有写博客了,上一次更新竟然是一月份. 说工作忙都是借口,咋有空看美剧呢. 这半年荒废掉博客说到底就是懒,惯性的懒惰.写博客这事 ...
- scala中的self type
scala目前的书籍有两<快学scala>和<scala编程>.资料确实不多,对这个语法使用只能结合使用进行理解. 先看源码: private[spark] trait Act ...
- Beginning Scala study note(8) Scala Type System
1. Unified Type System Scala has a unified type system, enclosed by the type Any at the top of the h ...
- [翻译]The Neophyte's Guide to Scala Part 12: Type Classes
The Neophyte's Guide to Scala Part 12: Type Classes 过去的两周我们讨论了一些使我们保持DRY和灵活性的函数式编程技术,特别是函数组合,partial ...
- scala学习笔记(四)样本类与模式匹配
访问修饰符 格式:private[x]或protected[x],x指某个所属包.类或单例对象,表示被修饰的类(或方法.单例对象),在X域中公开,在x域范围内都可以访问: private[包名]:在该 ...
- Spark基础-scala学习(一、入门)
Scala解析器的使用 REPL:Read(取值)-> Evaluation(求值)-> Print(打印)->Loop(循环).scala解析器也被称为REPL,会快速编译scal ...
- Scala详解
1 快速入门... 4 1.1 分号... 4 1.2 常变量声明... 4 1.2.1 val常量... 4 1.2.2 ...
随机推荐
- C#控制台下的AO程序
好几年没写过控制台程序了(上一次是大二时写坐标转换时用过),因为我觉得用户难以接受没有良好操作界面的应用程序,我不想偷懒,今天来将应用程序改写为控制台程序,记录一下,忘记的内容: 1.数据的交互 不管 ...
- 教大家如何在word 2007中同时打出对齐上下标以及字母头上有波浪线(非编辑器)
教大家如何在word 2007中打出(非编辑器): 如果要在多个字符串上面加上划线,可以使用一下步骤 按下“Ctrl+F9”组合键,出现“{}”,在{}中输入“EQ \x\to(要加上划线的字符串)” ...
- UNIX网络编程读书笔记:名字与地址转换
概述 在名字和数值地址间进行转换的函数: gethostbyname和gethostbyaddr:在主机名字与IPv4地址之间进行转换.仅仅支持IPv4. getservbyname和getservb ...
- 用mapreduce来操作hbase的优化
(1)scan.setCacheBlocks(false); 初始化map任务 TableMapReduceUtil.initTableMapperJob 本次mr任务scan的所有数据不放在缓 ...
- mariadb 10.1.10安装
Maridb 10.1.10 on centos 6.6 *********************************************************************** ...
- HTML 事件属性(如:onsubmit)
学习啥都需要一个基础 基础很重要: HTML 4 的新特性之一是可以使 HTML 事件触发浏览器中的行为,比方说当用户点击某个 HTML 元素时启动一段 JavaScript. 在现代浏览器中都内置有 ...
- 微信小程序之底部弹框预约插件
代码地址如下:http://www.demodashi.com/demo/13982.html 一.前期准备工作: 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.c ...
- ASP.NET总结
ASP.NET已经学习完.学牛腩的时候面对一些控件和方法会用,但对当中的原理还不懂.学习这部分的内容时, 从头到尾都有一种相识的感觉,把之前一些不懂得地方也理解了,每个知识都有相应的样例练习,学起来还 ...
- 【PHP】在目标字符串指定位置插入字符串
PHP如何在指定位置插入相关字符串,例子:123456789变为1_23_456789插入"_"到指定的位置! (可以用作换行或者其他处理) 插入示例,具体思路在代码中有注释: & ...
- Oracle常用函数脑图
全面的可参考(四)Oracle学习笔记—— 常见函数