Подтвердить что ты не робот

Почему я не могу написать println "Hello world" в Scala?

Я новичок в Scala, но я думал, что одной из сильных сторон языка было удаление церемонии, например, скобки и точки, которые существуют, например, для Java. Поэтому я был довольно смущен, когда обнаружил, что могу писать, например,

str1 equals str2

но не

println "Hello world"

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

4b9b3361

Ответ 1

Когда есть только две части, выражение рассматривается как вызов метода. То есть единственная возможность для

println "Hello, world"

будет

println."Hello, world"

что, конечно, здесь не имеет особого смысла. (***** см. ниже для добавления)

Если вам нравится, вы можете написать Console println "Hello, World" для устранения двусмысленности.

Это не похоже на эту двусмысленность в примере строки, строка вряд ли может быть именем метода, но подумайте о следующем:

class B
val b = new B

object A {
  def apply(myB: B) { print("apply") }
  def b { print("b") }
}

Теперь, при написании A b, что я получу. Как это следует интерпретировать? Оказывается, что:

A b // "b"
A.b // "b"
A(b) // apply

Итак, существует четкое правило, что делать в двухкомпонентном выражении. (Надеюсь, никто не начнет раскалывать волосы о apply и действительном вызове метода...)

Добавление

С появлением динамических классов вы можете немного поиграть и определить следующие

object println extends Dynamic {
  def typed[T] = asInstanceOf[T]
  def applyDynamic(name: String)(args: Any*) = Console.println(name)
}

А теперь посмотри!, круглых скобок:

println `Hello, world` // prints, "Hello, world"

Конечно, пожалуйста, не делайте этого перед детьми или в реальном коде.

Ответ 2

Вы можете переписать свой второй пример тремя "частями", и в этом случае он будет компилироваться без круглых скобок:

Predef println "Hello world"

(Только для иллюстративных целей - ответ @Debilski - идеальный!)