Scala创建新的控制结构
来源:互联网 发布:mac怎么更新safari 编辑:程序博客网 时间:2024/05/01 16:35
创造新的控制结构——问号表达式 “? :”
Scala的英文意思是“可伸展的”。Scala之所以叫这个名,就是取意这个语言是“可伸展的语言”。他的可伸展性表现在很多方面。今天主要总结一下他在创造新的控制结构方面的能力。
语言内置的控制结构有:for,if...else,while等,在Scala里,你完全可以写出自己的控制结构,让它感觉像是语言本身就支持一样。先把示例抛出来——Scala里没有Java、C++里的问号表达式 ? : ,下面我们自己如何来给Scala里引入这个控制结构,代码如下:
object work { implicit class Condition(p: Boolean) { def ?[A] (first: A): Selection[A] = new Selection(p, first) } class Selection[A](p: Boolean, first: A) { def | (second: A): A = p match { case true => first case _ => second } }}
测试一下:
println( (1 > 0) ? "good" | "bad")// > good
看看 (1 > 0) ? "good" | "bad" 这个语句是怎么执行的
1. (1 > 0) 返回一个Boolean类型的值
2. 由于Boolean类型没有名叫 ? 的函数,编译器会把Boolean值隐式转换为Condition类型
Condition类被声明为implicit,这是一个隐式类,他的主构造函数就相当于隐式转换函数。(注:隐式类的主构造函数只能有一个参数)。编译器发现一个Boolean类型后面跟着一个 ? 的方法,Boolean类型里没有这个方法,他就会在编译上下文中去找一个可用的隐式转换。隐式转换实际上相当于执行了new Condition(1 > 0)。
3. 执行Condition类型的 ? 操作后,返回一个Selection对象
这里 ? 成员函数的调用方法是“中缀操作符标注”的调用方法。 在Scala里没有运算符的概念,一切都是函数调用,比如1 + 2实际上调用的Int类型的+方法,其等同于1.+(2)。但是如果只能写成1.+(2)这样,非常不优雅,为此,Scala提供这种“中缀操作符标注”的方式:1 + 2。所以,例子中的 (1 > 0) ? "good" 实际上等于与(1 > 0).?("good"),这样产生了一个Selection对象
4. 执行Selection类型的 | 操作,返回整个问号表达式运算结果值
同上,Selection的 | 也是一个"中缀操作符标注", "bad"是这个方法的入参。(注:由于Scala里冒号:不能做方法名,所有这里用|代替)
剥开语法糖衣,还原本来面目
这个例子中的“中缀操作符标注”、隐式转换等,都是为了使问号表达式“ ? | ”用起来像Scala原生自带的关键字一样。抛开一层层语法糖衣,他的本来面目是这样的:
(new Condition( (1 > 0) ).?("good")).|("bad")
总结
这个小例子展现了Scala强大的“可伸展性”——可以创建新的控制结构,扩展Scala语言本身。这也是Scala语言迷人之处!
短短几行代码,涉及着很多知识:
1. 隐式转换
2. Scala里的操作符(中缀操作符)
3. 类型参数
- Scala创建新的控制结构
- scala 新的控制结构,函数调用结构的变化
- Scala的内建控制结构
- scala控制结构
- Scala控制结构讲解
- 2.scala控制结构
- scala控制结构
- Scala控制结构
- scala中的控制结构
- scala自定义控制结构
- Scala 控制结构内部揭密
- scala基础之控制结构
- scala学习三 控制结构
- Scala 控制结构和函数
- Scala学习笔记-控制结构
- Scala入门之控制结构
- Scala中的基本控制结构
- scala学习之控制结构
- *eclipse 中添加工程 Some projects cannot be imported because they already exist in the workspace
- MYSQL修改密码并设置允许远程访问
- 使用gettext来支持PHP的多语言
- 素数比率
- js 添加到收藏夹, 函数 AddFavorite(兼容IE,FF,OP)
- Scala创建新的控制结构
- IE firefox hack集
- js动态生成div和事件
- 3Sum Closest
- <!--[if IE]>….<![endif]--> (<!--[if !IE]>||<![endif]-->)
- Sizzle選擇器
- 日月潭之行
- Flex+PHP反向推送(长轮询)
- jQuery的ajax用法整理匯總