Що ви називаєте оператором -> в 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
Andrew Grimm

7
дратує чи не дратує, але гугл для "рубіну ->" прохання надати посилання на це питання, як перший первинний результат.
fl-web

6
@Kevin, можливо, все змінилося за останні 2 роки, але гугл ruby "->"- це те, як я знайшов цю посаду :)
Nippysaurus

Відповіді:


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 (з args). Приклади, які ви наводите ( ->(x) { x * 2 }& lambda { |x| x * 2 }), насправді еквівалентні.


10
FYI 2 стилі не є повністю взаємозамінними, якщо ви використовуєте do/ endчерез правила пріоритету. Це друкує перевіряється лямбда: puts -> do 1 end. Це передає блок puts, викрадаючи його у лямбда і спричиняючи АргументЕрор:puts lambda do 1 end
Келвін

1
Крім того, лямбдальні літерали рубіну 1.9.3 дозволяють аргументувати.
Кельвін

3
@Kelvin це було б тому, що Рубі намагається інтерпретувати puts lambda do 1 end, puts(lambda) do 1 endа не puts(lambda do 1 end). Останній насправді спрацьовує - Рубі просто намагається передати блок putsметоду, а не lambdaметоду, якщо немає дужок.
PJSCopeland

1
@PJSCopeland Я не кажу, що ти не можеш змусити їх діяти так само. Я кажу, що вони не є на 100% взаємозамінними синтаксисом, тобто ви не можете просто зробити заміну заміни у всіх випадках (тому що іноді вам потрібні додаткові дужки lambda).
Келвін

@rdurand Ви зробили редакцію із резюме "Стабільні лямбда не можуть приймати аргументи в Ruby 1.9"? Це не точно, принаймні для 1.9.3 - дозволені аргументи.
Келвін


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.