Come si chiama l'operatore -> in Ruby?


205
  1. Come si chiama l' ->operatore come di seguito?

    ->(...) do
      ...
    end
  2. I seguenti frammenti non sono equivalenti?

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

70
È fastidioso che non si possa google "->" - buona domanda da porre!
Kevin,

10
@ Kevin è possibile, tuttavia, utilizzare di Stack Overflow built-in Elastic Cerca per cercare "->": title:"->" [ruby] is:question. La chiave è usare le virgolette.

8
Symbolhound può anche fare questo: symbolhound.com/?q=-%3E+ruby
Andrew Grimm

7
fastidioso o non fastidioso, ma googling per la richiesta "ruby ->" fornisce il collegamento a questa domanda come primo risultato top.
fl-web,

6
@Kevin forse le cose sono cambiate negli ultimi 2 anni, ma googling ruby "->"è come ho trovato questo post :)
Nippysaurus,

Risposte:


238

Nel linguaggio di programmazione Ruby ("Metodi, Procs, Lambdas e Closures"), un lambda definito usando ->è chiamato lambda letterale .

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

Il codice è equivalente al seguente.

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

Informalmente, ho sentito che si chiama stabby lambda o stabby letterale .


127

=>== Hash Rocket

Separa le chiavi dai valori in una mappa hash letterale.


->== Dash Rocket

Utilizzato per definire un valore letterale lambda in Ruby 1.9.X (senza args) e Ruby 2.X (con args). Gli esempi che dai ( ->(x) { x * 2 }& lambda { |x| x * 2 }) sono in effetti equivalenti.


10
FYI I 2 stili non sono completamente intercambiabili se usi do/ a endcausa delle regole di precedenza. Questo stampa un lambda ispezionato: puts -> do 1 end. Questo passa il blocco a puts, rubandolo dalla lambda e causando un ArgumentError:puts lambda do 1 end
Kelvin

1
Inoltre, i letterali lambda del rubino 1.9.3 consentono argomenti.
Kelvin,

3
@Kelvin sarebbe perché Ruby cerca di interpretare puts lambda do 1 endcome puts(lambda) do 1 endpiuttosto che puts(lambda do 1 end). Quest'ultimo in effetti funziona - Ruby prova solo a passare il blocco al putsmetodo piuttosto che al lambdametodo se non ci sono parentesi.
PJSCopeland

1
@PJSCopeland Non sto dicendo che non puoi farli agire allo stesso modo. Sto dicendo che non sono sintassi intercambiabili al 100% per quanto riguarda, cioè non puoi semplicemente fare una sostituzione drop-in in tutti i casi (perché a volte hai bisogno di parentesi extra per lambda).
Kelvin,

@rdurand Hai effettuato la modifica con il riepilogo "Lo stallo lambdas non può accettare argomenti in Ruby 1.9"? Questo non è accurato, almeno per 1.9.3 - sono ammessi argomenti.
Kelvin,


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.