Wie nennt man den Operator -> in Ruby?

205
  1. Wie nennt man den ->Operator im Folgenden?

    ->(...) do
      ...
    end
  2. Sind die folgenden Schnipsel nicht gleichwertig?

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}
Matt - Sanemat
quelle
70
Es ist ärgerlich, dass Sie nicht "->" googeln können - eine gute Frage!
Kevin
10
@ Kevin Sie können jedoch die integrierte elastische Suche von Stack Overflow verwenden, um nach folgenden Elementen zu suchen "->": title:"->" [ruby] is:question. Der Schlüssel ist die Verwendung der Anführungszeichen.
8
Symbolhound kann dies auch: symbolhound.com/?q=-%3E+ruby
Andrew Grimm
7
ärgerlich oder nicht ärgerlich, aber googeln nach "ruby ->" Anfrage geben Link zu dieser Frage als erstes Top-Ergebnis.
Fl-Web
6
@ Kevin vielleicht haben sich die Dinge in den letzten 2 Jahren geändert, aber googeln ruby "->"ist, wie ich diesen Beitrag gefunden habe :)
Nippysaurus

Antworten:

238

In der Ruby-Programmiersprache ("Methods, Procs, Lambdas and Closures") wird ein mit definiertes Lambda-> als Lambda-Literal bezeichnet .

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

Der Code entspricht dem folgenden.

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

Informell habe ich gehört, dass es Stabby Lambda oder Stabby Literal genannt wird .

kiamlaluno
quelle
127

=>== Hash Rocket

Trennt Schlüssel von Werten in einem Hash-Map-Literal.


->== Dash Rocket

Wird verwendet, um ein Lambda-Literal in Ruby 1.9.X (ohne Argumente) und Ruby 2.X (mit Argumenten) zu definieren. Die Beispiele, die Sie ( ->(x) { x * 2 }& lambda { |x| x * 2 }) geben, sind tatsächlich gleichwertig.

Yarin
quelle
10
Zu Ihrer Information Die beiden Stile sind nicht vollständig austauschbar, wenn Sie do/ endaufgrund von Vorrangregeln verwenden. Dies druckt ein inspiziertes Lambda : puts -> do 1 end. Dies übergibt den Block an puts, stiehlt ihn aus dem Lambda und verursacht einen ArgumentError:puts lambda do 1 end
Kelvin
1
Auch die Lambda-Literale von Ruby 1.9.3 erlauben Argumente.
Kelvin
3
@ Kelvin das wäre, weil Ruby versucht, puts lambda do 1 endals puts(lambda) do 1 endeher als zu interpretieren puts(lambda do 1 end). Letzteres funktioniert tatsächlich - Ruby versucht nur, den Block an die putsMethode und nicht an die lambdaMethode zu übergeben, wenn keine Klammern vorhanden sind.
PJSCopeland
1
@PJSCopeland Ich sage nicht, dass Sie sie nicht dazu bringen können, dasselbe zu tun. Ich sage, sie sind syntaktisch nicht zu 100% austauschbar, dh Sie können nicht einfach in allen Fällen einen Drop-In-Ersatz durchführen (da Sie manchmal zusätzliche Klammern benötigen lambda).
Kelvin
@rdurand Haben Sie die Bearbeitung mit der Zusammenfassung "Stabby Lambdas können in Ruby 1.9 keine Argumente akzeptieren" vorgenommen? Dies ist zumindest für 1.9.3 nicht korrekt - Argumente sind zulässig.
Kelvin
3

->(x) { ... }ist das gleiche wie lambda { |x| ... }. Es entsteht ein Lambda. Siehe Kernel # lambda Ein Lambda ist eine Art von Prozess, der sicherstellt, dass die Anzahl der an ihn übergebenen Parameter korrekt ist. Siehe auch Proc :: new und Kernel # proc .

Cary Swoveland
quelle