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}

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 .


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.


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


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.