#scala #lambda
#scala #лямбда
Вопрос:
Читая статью о монадах, я заметил, что автор заключил свои лямбда-выражения в блоки, используя фигурные скобки:
def foo(bar: String) = {
({ () => println(bar) })()
({ () => bar.length })()
}
Чем это отличается от простого использования одной пары круглых скобок? (Что имеет смысл синтаксически.)
Я попробовал обе формы в интерпретаторе, и они обе правильные:
scala> ({ () => println(123) })()
123
scala> ( () => println(123) )()
123
Моим первым предположением было, что это как-то связано с правилами определения области видимости — но опять же, у лямбд-выражений нет имен, поэтому они не должны сильно влиять на пространство имен.
Ответ №1:
Это абсолютно ничего не дает. Дополнительный набор фигурных скобок игнорируется синтаксическим анализатором.
Скомпилируйте этот код:
object Test {
def x = ({ () => println(123) })()
def y = ( () => println(123) )()
}
с -Xprint:parser
, и промежуточный результат:
[[syntax trees at end of parser]]
package <empty> {
object Test extends scala.AnyRef {
def <init>() = {
super.<init>();
()
};
def x = (() => println(123))();
def y = (() => println(123))()
}
}
x
и y
результатом являются идентичные абстрактные синтаксические деревья.