Можно ли определять функции в Scala с помощью def? - PullRequest
1 голос
/ 09 июля 2020

Я нашел в Интернете ресурсы, в которых говорится, что функции можно определять с помощью термина def, но разве это не сделает функцию методом? Можно ли определять функции с помощью val и def? Также могут быть определены функции внутри объекта Singleton или Companion, поскольку методы находятся внутри классов, вызываемых в экземплярах классов, или где можно определить функции?

1 Ответ

4 голосов
/ 09 июля 2020

Я нашел в Интернете ресурсы, в которых говорится, что функции могут быть определены с помощью термина 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 не помогает избавиться от путаницы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...