Что вы называете оператором -> в 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)

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


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 - аргументы разрешены.
Кельвин


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.