Я нашел в Интернете ресурсы, в которых говорится, что функции могут быть определены с помощью термина def, но разве это не сделает функцию методом?
Да, def
определяет методы , а не функции в Scala. Если вы не говорите о локальных функциях , которые вложены в методы:
def thisIsAMethod = {
val outerVal = 42
def thisIsANestedLocalFunction = {
println("Hello from local function")
outerVal
}
thisIsANestedLocalFunction
thisIsANestedLocalFunction
}
thisIsAMethod
// Hello from local function
// Hello from local function
//=> val res: Int = 42
Можно ли определять функции с помощью val и def?
Их нельзя определить ни с val
, ни def
. val
определяет переменную, def
определяет метод. Ни один из них не определяет функцию. Функции на самом деле не определены вообще , они инстанциированы , поскольку они просто объекты, как и любой другой объект.
Вы бы не сказали, что "Hello"
«определяет строку», он просто «создает» (или «создает» или, возможно, «оценивает») строку. То же и с функциями. (x: Int) => 2 * _
не «определяет» функцию, а создает ее экземпляр.
Также функции могут быть определены внутри объекта Singleton или Companion, поскольку методы находятся внутри классов, вызываемых в экземплярах класса, или где могут быть определены функции?
Опять же, функции не «определены». Это просто объекты, как и любой другой объект. У вас может быть функция везде, где у вас может быть любая строка, список, целое число, что угодно.
Это неправильно. Методы могут быть определены в:
- классах
- чертах
- объектах
- объектах пакета
- скриптах
- … И я мог что-то забыть
Возвращаясь к исходному вопросу:
Я нашел в Интернете ресурсы, в которых говорится, что функции можно определять с помощью термина def
Не стоит верить всему, что вы читаете в Интернете; -)
Но, серьезно, шутя в сторону, я могу представить пару причин, по которым кто-то может утверждать что-то подобное:
Они не понимают разницы между методами и функциями.
Они понимают разницу между методами и функциями, но вызывают методы "functions" в любом случае.
Они относятся к методам, которые возвращают функции, например, что-то вроде:
def thisIsAMethod(a: Int, b: Int) = (a, b) => _ + _
Это метод, который возвращает функцию. Это не функция, определенная с помощью def
. Тот факт, что методы могут возвращать функции, является тривиальным утверждением. Функции являются объектами, и, конечно, методы могут возвращать объекты, иначе они были бы бесполезны.
Даже Scala Спецификация языка иногда использует термин «функция» для обозначения ситуации. где не имеет значения, является ли что-то методом, локальной функцией или переменной, привязанной к объекту функции. Таким образом, SLS использует термин «функция» и для обозначения функций собственно, и для обозначения более общей концепции «чего-то, что можно назвать ". Это тоже root не помогает избавиться от путаницы.