在 Scala 中,我可以创建一个案例类,case class Foo(x:Int)
,然后将其放入列表中,如下所示:
List(Foo(42))
现在,这里没什么奇怪的了。以下内容对我来说很奇怪。运营商::
是列表上的函数,对吗?对于 Scala 中任何带有一个参数的函数,我都可以使用中缀表示法来调用它。
一个例子是1 + 2
是一个函数(+)
在物体上Int
。班上Foo
我刚刚定义的没有::
运算符,那么以下怎么可能呢?
Foo(40) :: List(Foo(2))
在 Scala 2.8 RC1 中,我从交互式提示中得到以下输出:
scala> case class Foo(x:Int)
defined class Foo
scala> Foo(40) :: List(Foo(2))
res2: List[Foo] = List(Foo(40), Foo(2))
我可以继续使用它,但是解释是什么?
从规格来看:
6.12.3 中缀操作 中缀操作符可以是任意的
标识符。中缀运算符有
优先级和结合性定义
如下。
...
运算符的结合性是
由操作者最后的决定
特点。以冒号结尾的运算符
‘:’ 是右结合的。所有其他
运算符是左结合的。
在程序经过编译器的“typer”阶段后,您始终可以通过打印程序来了解这些规则如何在 Scala 中应用:
scala -Xprint:typer -e "1 :: Nil"
val r: List[Int] = {
<synthetic> val x$1: Int = 1;
immutable.this.Nil.::[Int](x$1)
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)