Какие символы я могу опустить в Scala?
Вопрос
В Scala, почему я могу опустить точку и скобки в T m 0
(вместо T.m (0)
) в следующем?
scala> object T { def m(i:Int) = 0 == i }
defined module T
scala> T m 0
res19: Boolean = true
Но почему я не могу опустить скобки в n (0)
в следующем?
scala> def n(i:Int) = 0 == i
n: (Int)Boolean
scala> n 0
<console>:1: error: ';' expected but integer literal found.
n 0
^
Решение
Предыдущий пример, T m 0, является примером "операторной нотации". Scala имеет три типа нотации операторов: префикс (называемый унарным), инфиксный и постфиксный. Давайте посмотрим примеры всех трех в действии здесь:
class MyByte(val n : Int) {
require(n >= 0 && n <= 255)
def unary_! = new MyByte(n ^ 0xff)
def +(m : MyByte) = new MyByte(n + m.n)
def bits = (math.log(n) / math.log(2) + 1).toInt
override def toString = "0" * (8 - bits) + n.toBinaryString
}
Здесь он используется:
scala> val a = new MyByte(5)
a: MyByte = 00000101
scala> val b = new MyByte(10)
b: MyByte = 00001010
scala> ! a // Prefix/Unary
res58: MyByte = 11111010
scala> a + b // Infix
res59: MyByte = 00001111
scala> b bits // Postfix
res60: Int = 4
Хотя нотации infix и postfix принимают любой действительный идентификатор Scala, хотя и ведутся разговоры об ограничении нотации postfix, в качестве префикса можно использовать только четыре идентификатора: ~,!, - и +.
Теперь, когда вы пытаетесь "m 0", Scala отбрасывает его как унарный оператор на том основании, что он недопустим (~,!, - и +). Он находит, что " m " является допустимым объектом - это функция, а не метод, и все функции являются объектами.
As " 0 " не является действительным идентификатором Scala, он не может быть ни инфиксным, ни постфиксным оператором. Поэтому Scala жалуется, что ожидал " ;; " - которые будут разделять два (почти) допустимых выражения: " m " и "0". Если вы вставите его, то он будет жаловаться, что m требует либо аргумента, либо, в случае неудачи, a " _ " превратить его в частично примененную функцию.
Другие советы
Я считаю, что стиль синтаксиса оператора работает только тогда, когда у вас есть явный объект в левой части. Синтаксис предназначен для того, чтобы вы могли выразить «операнд-оператор-операнд» стиль операций естественным образом.