функция map в Scala

В программировании на Scala использование анонимных функций — обычное дело. когда я решаю создать вектор как результат анонимной функции двумя разными способами: первый: var hold1=(1 to 5).map(_*2) второй: var hold2=(1 to 5).map(2*) Я хочу знать, в чем разница между этими двумя объявлениями?


person Ravindu De Silva    schedule 09.04.2017    source источник


Ответы (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
comment
однако может быть интересно взглянуть на сгенерированный код. _ * 2 почти наверняка создает анонимную лямбду, но 2 * может и не создавать. - person Rob Starling; 09.04.2017
comment
Они абсолютно одинаковы, только если предположить, что Int.* симметричен! Это неверно в общем случае. - person Jörg W Mittag; 09.04.2017
comment
Почему вторая версия, которая вызывает метод .*, не требует _? Разве это не должно быть (1 to 5).map(2 * _) ? - person Jon Taylor; 09.04.2017

Оба точно такие же. Вы можете использовать символ подчеркивания по-разному. Перейдите по этой ссылке для получения более подробной информации.

Каковы все виды использования подчеркивания в Scala?< /а>

person Sivakumar    schedule 09.04.2017