2013-01-17 3 views
1

Действительно простой вопрос Scala.Кронштейны, необходимые при использовании подхода infix?

Каким образом инфиксный подход к 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 
    ^
+1

Когда вы вызываете метод точкой, вам нужно заключить параметры в скобки, как в регулярном 'obj.somemethod (someparam, foo, bar)' – ghik

+0

Не нужны скобки: '1. + 2', но тип результата is 'Double' – idonnie

+2

@idonnie Да, но это что-то еще. То, что вы написали, эквивалентно '1.0 + 2' (точка означает десятичный разделитель, а не вызов метода) – ghik

ответ

3

Все в Scala является объектом, так 1 .+(2) означает вызвать метод + на объекте 1 с параметром 2. И, конечно, если вы вызываете такой метод, вам нужно заключить в скобки параметры, как в обычном obj.somemethod(someparam,foo,bar).

Обозначение Infix (1 + 2) фактически означает одно и то же (это синтаксический сахар для вызова метода с одним параметром).

И пространство перед точкой необходимо, чтобы точка была интерпретирована как вызов метода, а не как десятичный разделитель. В противном случае 1.+(2) или 1.+2 будет интерпретирован как 1.0 + 2.

+2

Мне не нравится идея обнародования мифа. Не все в Scala - это объект в смысле того, что он является экземпляром класса.Язык только заставляет его казаться таким образом, обеспечивая прозрачный бокс и распаковку или предоставляя встроенные операции для родных типов JVM. –

+1

Со ссылкой на http://www.scala-lang.org/node/128: _ В отличие от Java, все значения в Scala являются объектами (включая численные значения и функции). Поскольку Scala является основанной на классе, все значения являются экземплярами класса. Конечно, это не означает, что все в Scala представлено в JVM как объект. Но тем не менее, в терминах Scala каждое значение представляет собой объект, который означает, что это экземпляр класса (опять же, в терминах Scala), который имеет методы и т. Д. – ghik

2

Я думаю, что это связано с определением языка:

Левое ассоциативной бинарной операцией e1 e2 оп интерпретируется как e1.op (е2).

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), и вам нужно покинуть пространство для его работы.