Jak nazywasz operatora -> w Ruby?


205
  1. Jak nazywacie ->operatora jak poniżej?

    ->(...) do
      ...
    end
  2. Czy poniższe fragmenty nie są równoważne?

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}

70
To denerwujące, że nie możesz wyszukiwać w Google „->” - dobre pytanie!
Kevin

10
@Kevin można jednak użyć przepełnienia stosu wbudowanej Elastic Search do wyszukiwania "->": title:"->" [ruby] is:question. Kluczem jest użycie cudzysłowów.

8
Symbolhound może to również zrobić: symbolhound.com/?q=-%3E+ruby
Andrew Grimm

7
denerwujące lub nie denerwujące, ale googling dla żądania „ruby ->” daje link do tego pytania jako pierwszego najlepszego wyniku.
fl-web

6
@Kevin może coś się zmieniło w ciągu ostatnich 2 lat, ale googling ruby "->"to sposób, w jaki znalazłem ten post :)
Nippysaurus

Odpowiedzi:


238

W języku programowania Ruby („Methods, Procs, Lambdas and Closures”) lambda zdefiniowana za pomocą ->nazywana jest literałem lambda .

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

Kod jest równoważny z następującym.

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

Nieoficjalnie słyszałem, że nazywa się to stabby lambda lub stabby dosłownie .


127

=>== Hash Rocket

Oddziela klucze od wartości w literale mapy skrótów.


->== Rakieta Dash

Służy do definiowania literału lambda w Ruby 1.9.X (bez argumentów) i Ruby 2.X (z argumentami). Podane przykłady ( ->(x) { x * 2 }i lambda { |x| x * 2 }) są w rzeczywistości równoważne.


10
FYI 2 style nie są w pełni zamienne, jeśli używasz do/ z endpowodu reguł pierwszeństwa. Drukuje kontrolowanej lambda puts -> do 1 end. To przekazuje blok do puts, kradnąc go z lambda i powodując ArgumentError:puts lambda do 1 end
Kelvin

1
Również literały lambda ruby ​​1.9.3 pozwalają na argumenty.
Kelvin,

3
@Kelvin byłoby tak, ponieważ Ruby próbuje interpretować puts lambda do 1 endjako puts(lambda) do 1 endzamiast puts(lambda do 1 end). Ta ostatnia faktycznie działa - Ruby po prostu próbuje przekazać blok do putsmetody, a nie do lambdametody, jeśli nie ma nawiasów.
PJSCopeland

1
@PJSCopeland Nie mówię, że nie można ich zmusić do działania tak samo. Mówię, że nie są one w 100% wymienne pod względem składni, tzn. Nie można po prostu zastąpić drop-in we wszystkich przypadkach (ponieważ czasami potrzebujesz dodatkowych nawiasów lambda).
Kelvin,

@rdurand Czy dokonałeś edycji streszczeniem „Stabby lambdas nie akceptuje argumentów w Ruby 1.9”? To nie jest dokładne, przynajmniej dla 1.9.3 - dozwolone są argumenty.
Kelvin,


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.