2016-09-28 1 views
0

Я совершенно не знаком с Scala. Я запутался в поведении lazy val в REPL.Действительно ли Scala lazy val оценивает выражение для получения окончательного типа во время назначения

scala> lazy val a = {println("Hello, World!!!"); 5} 
a: Int = <lazy> 

scala> a 
Hello, World!!! 
res0: Int = 5 

Я могу видеть, что в РЕПЛ, тип lazy vala был назначен правильно, сразу после объявления.

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

Заранее спасибо.

ответ

4

Короткий ответ: нет.

Более длинный ответ: алгоритм вывода типа не требует запуска кода, он должен анализировать только абстрактное синтаксическое дерево (структурированное представление вашего кода, созданного синтаксическим анализатором), чтобы указать тип, а lazy val s не делает исключение ,

3

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

Легко видеть, что должен быть первым, так как если бы это был второй один, Hello, World!!! будет напечатан дважды.

Смежные вопросы