Инициализация объекта с помощью блока инициализации - PullRequest
2 голосов
/ 06 ноября 2011

Вчера я читал статью под названием: Как опыт Scala улучшил нашу разработку Java .

Внутри раздела «Инициализация объекта» написано:

Идиоматическая техника Scala для создания объекта (которая делает не раскрывать все соответствующие параметры через аргументы конструктора) создать анонимный подкласс с блоком инициализатора, который вызывает дополнительные заявления [Одерский и др.]:

Я делал несколько тестов:

class B {
  var x1: String = "B"

  def setText(text: String) {
    x1 = text   
  }

  override def toString = x1
}

Я не очень понимаю, почему я могу сделать:

scala> new B{setText("new Text")}
res23: B = new Text

но я не могу сделать:

scala> new B{ setText "new Text" }
<console>:1: error: ';' expected but string literal found.
       new B{ setText "new Text" }
                      ^

Ответы [ 2 ]

11 голосов
/ 06 ноября 2011

Это не имеет большого отношения к блоку инициализации. Просто синтаксис с сахаром

a b

означает

a.b

а не

a(b)

или в общем случае

obj meth arg

является сахаром для

obj.meth(arg)

с arg необязательно.

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

new B { this setText "new Text" }

Если по какой-либо причине вы хотите сохранить символы, вы можете добавить псевдоним самостоятельного ввода:

new B { o =>
  o setText "new Text"
  o setTitle "a Title"
  o setSomeOtherArgument someArg
}
4 голосов
/ 06 ноября 2011

«Оператор нотации» требует явного получателя. Например:

print("hello");

будет работать, но:

print "hello"

Не будет.

Опять это будет работать и печатать "hello"

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