Какие символы я могу опустить в 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
         ^

2 ответа

Решение

Первый пример, 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

В то время как инфиксная и постфиксная нотация принимает любой действительный идентификатор Scala, хотя есть разговоры об ограничении постфиксной нотации, только четыре идентификатора могут использоваться в качестве префикса: ~,!, - и +.

Теперь, когда вы используете "m 0", Scala отбрасывает его как унарный оператор на том основании, что он недопустим (~,!, - и +). Он обнаруживает, что "m" является допустимым объектом - это функция, а не метод, и все функции являются объектами.

Так как "0" не является допустимым идентификатором Scala, он не может быть ни инфиксным, ни постфиксным оператором. Поэтому Скала жалуется, что ожидал ";" - которые будут разделять два (почти) допустимых выражения: "m" и "0". Если вы вставите его, то он будет жаловаться, что m требует либо аргумента, либо, в случае неудачи, "_", чтобы превратить его в частично примененную функцию.

Я считаю, что стиль синтаксиса оператора работает только тогда, когда у вас есть явный объект в левой части. Синтаксис предназначен для того, чтобы вы могли естественным образом выражать операции в стиле "оператор-операнд".

Другие вопросы по тегам