Каковы определения именованного метода и именованной функции? - PullRequest
3 голосов
/ 08 сентября 2011

Я прочитал вопрос Разница между методом и функцией в Scala и много статей о различиях между методом и функцией.У меня появилось ощущение, что «метод» - это просто «именованная функция», определенная как метод в классе, признаке или объекте.«Функция» представляет такие вещи, как «анонимная функция», «литерал функции» или «объект функции» в этих статьях.Свидетельство можно найти в книге «Программирование в Scala http://www.artima.com/shop/programming_in_scala_2ed», стр. 141, раздел 8.1, «Самый распространенный способ определения функции - это член некоторого объекта. Такая функция называется методом».

Однако, когда я проверил справочник по языку Scala http://www.scala -lang.org / documents / files / ScalaReference.pdf , существуют такие понятия, как именованный метод.На странице 91, раздел 6.20. Выражения возврата: «Возвращаемое выражение возврата e должно происходить внутри тела какого-либо включающего именованного метода или функции».Вы также можете найти термин «именованная функция» на той же странице и в других местах.

Итак, мой вопрос в Scala: относятся ли метод, именованный метод и именованная функция к одному и тому же понятию?Где вы получаете определение именованной функции?

В коде List(1, 2).map(_ + 1) исходное выражение _ + 1 является именованным методом, затем метод преобразуется в функцию.Что это за функция, анонимная функция, объект функции, именованная функция?

В моем понимании, Scala имеет только два типа функций: именованная функция, которая является методом;анонимная функция, которая является литералом функции.Функциональный литерал скомпилирован в функциональный объект функции FunctionN для использования в чистом объектно-ориентированном мире Scala.

Однако для обычного именованного funciton / метода, такого как _ + 1 в приведенном выше коде, почему Scala преобразует его в другой функциональный объект?

Ответы [ 2 ]

7 голосов
/ 08 сентября 2011

Ответы на связанный вопрос охватывают это довольно хорошо, но для решения ваших конкретных запросов:

  • method => То, что вы определяете с помощью ключевого слова def
  • namedmethod => То же самое, все методы имеют имена
  • named function => функция, которая была назначена значению или преобразована из метода.В отличие от анонимной функции.

Разница между методом и функцией несколько похожа на разницу между int примитивом и Integer в штучной упаковке в Java.

В общем обсуждении обычно слышат, что оба описываются как "целые числа".Обычно это не проблема, но вы должны быть точными, когда различие имеет значение .

Аналогично, метод будет автоматически преобразован в функцию (и, следовательно, в объект) когда ваша программа требует этого, очень похоже на примитивный бокс.Так что не полностью неправильно называть метод функцией.

ОБНОВЛЕНИЕ

Так как же это работает?

Когда вы пытаетесь передать метод в качестве аргумента, например, List[A].map, компилятор сгенерирует внутренний класс (с синтетическим именем), который выводит Function1[A,B], и метод apply, который делегирует метод, который вы изначальнов комплект поставки.Экземпляр этого будет передан в качестве фактического аргумента.

7 голосов
/ 08 сентября 2011

На уровне языка есть только два понятия,

  • Методы являются фундаментальными строительными блоками Scala. Методы имеют имена всегда . Методы живут в классах или чертах. Методы являются конструкцией, встроенной в JVM, и, таким образом, одинаковы как в Scala, так и в Java. Методы в Scala (в отличие от функций) могут иметь специальные функции: они могут быть абстрагированы по параметрам типа, их аргументы могут иметь значения по умолчанию или быть неявными и т. Д.

  • Функциональные объекты являются просто экземплярами функциональной черты (Function1, Function2, ...). Функция оценивается, когда вызывается метод apply объекта функции. Существует специальный синтаксис для определения безымянных «анонимных» функций (иначе, «функциональные литералы»). Функция - это просто значение, и как таковое может быть названо (например, val f: (Int => Int) = (x => x)). Тип A => B является сокращением для Function1[A, B].

В связанном вопросе SO было упомянуто, что в некоторых ссылках (например, в спецификации Scala) слово «функция» неточно используется для обозначения «метода» или «объекта функции». Я предполагаю, что отчасти причина в том, что методы могут быть автоматически преобразованы в функциональные объекты, в зависимости от контекста. Однако обратите внимание, что обратное преобразование не имеет смысла: метод не является первоклассным значением, которое живет в куче с собственным независимым существованием. Скорее, метод неразрывно связан с классом, в котором он определен.

...