Например, рассмотрим следующие определения функций и методов, которые работают одинаково:
Методы и функции не одинаковы в Scala. Они на самом деле очень разные. Методы не являются объектами первого класса, тогда как функции. То есть у вас никогда не будет переменной, тип которой является типом метода.
Как следствие этого, давайте посмотрим на типы без подчеркивания.
val f = meth
val g = func
Поскольку meth
- это метод, он будет , называемый . Поэтому первая строка будет пытаться вызвать meth()
без аргументов, ошибка. func
, однако, это обычное значение, поэтому проблем нет. У нас просто будет другой псевдоним func
, называемый g
.
val f = meth _
val g = func _
Чтобы позволить нам рассматривать методы как объекты, Scala вводит синтаксис _
. При использовании с методом он преобразует этот метод в функциональный объект. Так что meth _
- это специальный синтаксис метода, который превращает его в функцию. С другой стороны, func _
принимает значение (помните, что функции - это объекты, как строки или что-то еще) и поднимает его, чтобы он стал функциональным объектом. Самый простой способ сделать это - добавить пустой список аргументов, так что это именно то, что делает Scala.
tl; dr Установка _
после имени превращает вещь в функциональный объект. Если вещь является методом, она не применяется. Если вещь является значением (включая, но не ограничиваясь функцией), она создает новый объект функции.