Почему я не могу написать println "Hello world" в Scala? - PullRequest
23 голосов
/ 01 сентября 2010

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

str1 equals str2

, но не

println "Hello world"

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

Ответы [ 2 ]

52 голосов
/ 01 сентября 2010

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

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"

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

5 голосов
/ 18 ноября 2012

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

Predef println "Hello world"

(только для иллюстрации - ответ @ Дебилски идеален!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...