Нет разницы между функцией def'ed и функцией val'ed:
scala> def test1 = (str: String) => str + str
test1: (String) => java.lang.String
scala> val test2 = test1
test2: (String) => java.lang.String = <function1>
scala> val test3 = (str: String) => str + str
test3: (String) => java.lang.String = <function1>
scala> val test4 = test2
test4: (String) => java.lang.String = <function1>
См? Все это функции, которые обозначены типом X => Y
, который у них есть.
scala> def test5(str: String) = str + str
test5: (str: String)java.lang.String
Вы видите X => Y
тип? Если вы это сделаете, иди к офтальмологу, потому что нет ни одного. Тип здесь (X)Y
, обычно используется для обозначения метода .
На самом деле test1
, test2
, test3
и test4
- это все методы, которые возвращают функции. test5
- это метод, который возвращает java.lang.String
. Кроме того, test1
- test4
не принимают параметры (в любом случае, только test1
), в то время как test5
.
Итак, разница довольно проста. В первом случае вы пытались назначить метод для val, но не указали параметры, которые принимает метод. Так что это не удалось, пока вы не добавили завершающее подчеркивание, что означало превратить мой метод в функцию .
Во втором примере у вас была функция, поэтому вам больше ничего не нужно было делать.
Метод не является функцией, и наоборот. Функция является объектом одного из FunctionN
классов. Метод является дескриптором некоторого фрагмента кода, связанного с объектом.
См. Различные вопросы о методах и функциях в переполнении стека.