Что вы называете оператором -> в Ruby?

205
  1. Что вы называете ->оператором, как в следующем?

    ->(...) do
      ...
    end
    
  2. Разве следующие фрагменты не эквивалентны?

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}
    
Мэтт - санемат
источник
70
Раздражает, что вы не можете гуглить "->" - хороший вопрос!
Кевин
10
@Kevin вы можете, однако, использовать переполнение стека встроенный в упругом Поиск искать "->": title:"->" [ruby] is:question. Ключ заключается в использовании кавычек.
8
Symbolhound также может сделать это: symbolhound.com/?q=-%3E+ruby
Эндрю Гримм
7
раздражает или не раздражает, но поиск в Google для запроса "ruby ->" дает ссылку на этот вопрос в качестве первого лучшего результата.
fl-web
6
@Kevin Может быть, все изменилось за последние 2 года, но ruby "->"я нашел этот пост в
Google,

Ответы:

238

В языке программирования Ruby («Методы, процедуры, лямбды и замыкания») лямбда, определенная с использованием ->, называется лямбда-литералом .

succ = ->(x){ x+1 }
succ.call(2)

Код эквивалентен следующему.

succ = lambda { |x| x + 1 }
succ.call(2)

Неофициально, я слышал, что его называют « лямбда- сабли» или « буквально-сабля» .

kiamlaluno
источник
127

=>== Хэш Ракета

Отделяет ключи от значений в литерале хэш-карты.


->== Тире Ракета

Используется для определения лямбда-литерала в Ruby 1.9.X (без аргументов) и Ruby 2.X (с аргументами). Примеры, которые вы приводите ( ->(x) { x * 2 }& lambda { |x| x * 2 }), фактически эквивалентны.

Ярина
источник
10
К вашему сведению 2 стиля не полностью взаимозаменяемы, если вы используете do/ endиз-за правил приоритета. Это печатает проверяемую лямбду: puts -> do 1 end. Это передает блок puts, крадя его из лямбды и вызывая ArgumentError:puts lambda do 1 end
Kelvin
1
Кроме того, лямбда-литералы ruby ​​1.9.3 допускают аргументы.
Кельвин
3
@Kelvin что бы потому , что Руби пытается интерпретировать , puts lambda do 1 endкак puts(lambda) do 1 endвместо puts(lambda do 1 end). Последний действительно работает - Ruby просто пытается передать блок putsметоду, а не lambdaметоду, если нет скобок.
ПАОПеленд
1
@PJSCopeland Я не говорю, что вы не можете заставить их действовать одинаково. Я говорю, что они не на 100% взаимозаменяемы по синтаксису, то есть вы не можете просто сделать замену во всех случаях (потому что иногда вам нужны дополнительные скобки lambda).
Кельвин
@rdurand Сделали ли вы правку со сводкой «Лямбда не может принимать аргументы в Ruby 1.9»? Это не точно, по крайней мере, для 1.9.3 - аргументы разрешены.
Кельвин
3

->(x) { ... }так же, как lambda { |x| ... }. Это создает лямбду. См. Ядро # лямбда . Лямбда - это тип процедуры, который гарантирует, что количество переданных ему параметров является правильным. Смотрите также Proc :: new и Kernel # proc .

Кэри Свовеланд
источник