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つのパラメーターでメソッドを呼び出すのはシンタックスシュガーです)。

また、ドットが小数点記号ではなくメソッド呼び出しとして解釈されるように、ドットの前のスペースが必要です。それ以外の場合1.+(2)1.+2またははとして解釈され1.0 + 2ます。

于 2013-01-17T10:21:21.590 に答える
2

I think it's to do with language definition:

A left-associative binary operation e1 op e2 is interpreted as e1.op(e2).

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

The form 1 .+ 2 is not specified anywhere so my guess is that the compiler is looking for either 1 + 2 or 1.+(2). In fact the compiler converts 1+2 into 1.+(2) normally. When using the . it expects a function and not the infix syntax.

Bottom line: you can use either but not something half way there.

PD: someone commented that calling a method you need to use it like this: obj.somemethod(someparam,foo,bar) but on that case you can also do this: obj somemethod (someparam,foo,bar) and you have to leave the spaces for it to work.

于 2013-01-17T10:24:51.307 に答える