非常简单的 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
^
非常简单的 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
^
Scala 中的一切都是对象,因此意味着使用参数1 .+(2)
调用+
对象上的方法。当然,如果你调用这样的方法,你需要将参数括在括号中,就像在常规中一样。1
2
obj.somemethod(someparam,foo,bar)
中缀表示法 ( 1 + 2
) 实际上意味着同样的事情(使用一个参数调用方法是语法糖)。
并且需要点之前的空格,以便点被解释为方法调用而不是小数分隔符。否则1.+(2)
或1.+2
将被解释为1.0 + 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)
你必须留出空间让它工作。