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}
Matt - sanemat
źródło
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 .

kiamlaluno
źródło
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.

Yarin
źródło
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,
3

->(x) { ... }jest taki sam jak lambda { |x| ... }. Tworzy lambda. Zobacz jądro # lambda lambda jest rodzajem proc, który zapewnia poprawność liczby przekazywanych parametrów. Zobacz także Proc :: new i Kernel # proc .

Cary Swoveland
źródło