Чего достигает обертывание лямбда-выражений Scala в блоки (используя как фигурные скобки, так и круглые скобки) перед их встроенным выполнением?

#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 результатом являются идентичные абстрактные синтаксические деревья.