Scala 使用中缀方法时是否需要括号?

Scala 使用中缀方法时是否需要括号?,scala,infix-notation,Scala,Infix Notation,这是一个非常简单的问题 为什么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) res8:Int=3 scala>1.+2 :1:错误:';'应为整型文

这是一个非常简单的问题

为什么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)
res8:Int=3
scala>1.+2
:1:错误:';'应为整型文字,但找到整型文字。
1 .+2
^

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

中缀符号(
1+2
)实际上意味着相同的事情(用一个参数调用方法是语法上的甜点)


点之前的空格是必需的,所以点被解释为方法调用,而不是十进制分隔符。否则
1.+(2)
1.+2
将被解释为
1.0+2

Scala中的所有内容都是对象,因此
1.+(2)
意味着使用参数
2
对对象
1
调用方法
+
。当然,如果调用这样的方法,需要将参数括在括号中,就像普通的
obj.somemethod(someparam,foo,bar)
一样

中缀符号(
1+2
)实际上意味着相同的事情(用一个参数调用方法是语法上的甜点)


点之前的空格是必需的,所以点被解释为方法调用,而不是十进制分隔符。否则,将将
1.+(2)
1.+2
解释为
1.0+2

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

左关联二进制操作e1 op e2被解释为e1.op(e2)

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

一句话:你可以使用其中任何一种,但不能半途而废


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

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

左关联二进制操作e1 op e2被解释为e1.op(e2)

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

一句话:你可以使用其中任何一种,但不能半途而废


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

当你按点调用方法时,你需要将参数括在括号中,就像在常规的
obj中一样。somemethod(someparam、foo、bar)
不需要括号:
1.+2
,但结果类型是
Double
@idonnie是的,但这是另外一种情况。您所写的内容相当于
1.0+2
(点表示十进制分隔符,而不是方法调用)@idonnie 1.+2将1转换为双精度,答案将是3.0。@dublintech是的,Scala中的所有内容都是一个对象,因此
1.+(2)
意味着在对象
1
上使用参数
2
调用方法。中缀符号(
1+2
)实际上意味着相同的事情(用一个参数调用方法是语法上的甜点)。关于dot之前的空格,请看我之前的评论。需要空格,以便将点解释为方法调用,而不是十进制分隔符。当按点调用方法时,需要将参数括在括号中,就像在常规的
obj中一样。somemethod(someparam,foo,bar)
不需要括号:
1.+2
,但结果类型是
Double
@idonnie Yes,但这是另外一回事。您所写的内容相当于
1.0+2
(点表示十进制分隔符,而不是方法调用)@idonnie 1.+2将1转换为双精度,答案将是3.0。@dublintech是的,Scala中的所有内容都是一个对象,因此
1.+(2)
意味着在对象
1
上使用参数
2
调用方法。中缀符号(
1+2
)实际上意味着相同的事情(用一个参数调用方法是语法上的甜点)。关于dot之前的空格,请看我之前的评论。需要空间,以便将点解释为方法调用,而不是十进制分隔符。我不喜欢发布神话的想法。并不是Scala中的所有东西都是类实例意义上的对象。该语言只是让它看起来像那样,执行透明的装箱和取消装箱,或者为JVM本机类型提供内置操作。因为Scala是基于类的,所以所有值都是类的实例。当然,这并不意味着Scala中的所有内容都在JVM中表示为对象。但无论如何,在Scala术语中,每个值都是一个对象,这意味着它是一个类的实例(同样,在Scala术语中),该类具有方法等。我不喜欢发布神话的想法。并不是Scala中的所有东西都是类实例意义上的对象。该语言只是让它看起来像那样,执行透明的装箱和取消装箱,或者为JVM本机类型提供内置操作。因为Scala是基于类的,所以所有值都是类的实例。当然,这个