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. 类型参数

0 0