1

非常简单的 Scala 问题。

为什么 1 + 2 的中缀方法不需要括号?

scala>1 + 2
res7: Int = 3

但是点方法呢?

scala>1 .+(2)
res8: Int = 3

scala> 1 .+2
<console>:1: error: ';' expected but integer literal found.
   1 .+2
       ^
4

2 回答 2

3

Scala 中的一切都是对象,因此意味着使用参数1 .+(2)调用+对象上的方法。当然,如果你调用这样的方法,你需要将参数括在括号中,就像在常规中一样。12obj.somemethod(someparam,foo,bar)

中缀表示法 ( 1 + 2) 实际上意味着同样的事情(使用一个参数调用方法是语法糖)。

并且需要点之前的空格,以便点被解释为方法调用而不是小数分隔符。否则1.+(2)1.+2将被解释为1.0 + 2

于 2013-01-17T10:21:21.590 回答
2

我认为这与语言定义有关:

左关联二元运算 e1 op e2 被解释为 e1.op(e2)。

http://www.scala-lang.org/docu/files/ScalaReference.pdf

形式 1 .+ 2 没有在任何地方指定,所以我的猜测是编译器正在寻找 1 + 2 或 1.+(2)。事实上,编译器通常会将 1+2 转换为 1.+(2)。使用时。它需要一个函数而不是中缀语法。

底线:您可以使用其中任何一种,但不能半途而废。

PD:有人评论说调用一个方法你需要像这样使用它:obj.somemethod(someparam,foo,bar)但在这种情况下你也可以这样做:obj somemethod (someparam,foo,bar)你必须留出空间让它工作。

于 2013-01-17T10:24:51.307 回答