В программировании на Scala использование анонимных функций — обычное дело. когда я решаю создать вектор как результат анонимной функции двумя разными способами: первый: var hold1=(1 to 5).map(_*2)
второй: var hold2=(1 to 5).map(2*)
Я хочу знать, в чем разница между этими двумя объявлениями?
функция map в Scala
Ответы (2)
Короче - они абсолютно одинаковые. Первый подход:
var hold1 = (1 to 5).map(_*2)
Давайте перепишем это другим способом, чтобы продемонстрировать, что на самом деле происходит под капотом (без синтаксического сахара).
var hold1 = (1 to 5).map(number => number.*(2))
Второй подход:
var hold2 = (1 to 5).map(2*)
Перепишите еще раз:
var hold2 = (1 to 5).map(number => 2.*(number))
Все, что происходит, это в первом случае мы вызываем *
def для числа 2, а во втором случае мы вызываем *
def для числа.
person
Tanjin
schedule
09.04.2017
однако может быть интересно взглянуть на сгенерированный код.
_ * 2
почти наверняка создает анонимную лямбду, но 2 *
может и не создавать.
- person Rob Starling; 09.04.2017
Они абсолютно одинаковы, только если предположить, что
Int.*
симметричен! Это неверно в общем случае.
- person Jörg W Mittag; 09.04.2017
Почему вторая версия, которая вызывает метод
.*
, не требует _
? Разве это не должно быть (1 to 5).map(2 * _)
?
- person Jon Taylor; 09.04.2017
Оба точно такие же. Вы можете использовать символ подчеркивания по-разному. Перейдите по этой ссылке для получения более подробной информации.
Каковы все виды использования подчеркивания в Scala?< /а>
person
Sivakumar
schedule
09.04.2017