¿Cómo se llama el operador -> en Ruby?

205
  1. ¿Cómo se llama al ->operador de la siguiente manera?

    ->(...) do
      ...
    end
  2. ¿No son equivalentes los siguientes fragmentos?

    succ = ->(x) {x + 1}
    succ = lambda {|x| x + 1}
Matt - sanemat
fuente
70
Es molesto que no puedas google "->" - ¡buena pregunta!
Kevin
10
@ Kevin se puede, sin embargo, el uso de desbordamiento de la pila incorporada elástico Buscar para buscar "->": title:"->" [ruby] is:question. La clave es usar las comillas.
8
Symbolhound también puede hacer esto: symbolhound.com/?q=-%3E+ruby
Andrew Grimm
77
molesto o no molesto, pero buscar en Google la solicitud "ruby ->" da un enlace a esta pregunta como primer resultado principal.
fl-web
66
@Kevin tal vez las cosas han cambiado en los últimos 2 años, pero googleé ruby "->"es cómo encontré esta publicación :)
Nippysaurus

Respuestas:

238

En Ruby Programming Language ("Métodos, Procs, Lambdas y Closures"), un lambda definido usando ->se llama lambda literal .

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

El código es equivalente al siguiente.

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

Informalmente, he escuchado que se llama stabby lambda o stabby literal .

kiamlaluno
fuente
127

=>== Hash Rocket

Separa las claves de los valores en un literal de mapa hash.


->== Dash Rocket

Se utiliza para definir un literal lambda en Ruby 1.9.X (sin args) y Ruby 2.X (con args). Los ejemplos que da ( ->(x) { x * 2 }& lambda { |x| x * 2 }) son de hecho equivalentes.

Yarin
fuente
10
FYI Los 2 estilos no son totalmente intercambiables si usa do/ enddebido a las reglas de precedencia. Esto imprime una lambda inspeccionado: puts -> do 1 end. Esto pasa el bloque a puts, robándolo de la lambda y causando un ArgumentError:puts lambda do 1 end
Kelvin
1
Además, los literales lambda de ruby ​​1.9.3 permiten argumentos.
Kelvin
3
@Kelvin eso sería porque Ruby intenta interpretarlo puts lambda do 1 enden puts(lambda) do 1 endlugar de hacerlo puts(lambda do 1 end). De hecho, esto último funciona: Ruby solo intenta pasar el bloque al putsmétodo en lugar del lambdamétodo si no hay corchetes.
PJSCopeland
1
@PJSCopeland No digo que no puedas hacer que actúen igual. Estoy diciendo que no son 100% intercambiables en cuanto a sintaxis, es decir, no puedes simplemente hacer un reemplazo directo en todos los casos (porque a veces necesitas paréntesis adicionales para lambda).
Kelvin
@rdurand ¿Hizo la edición con el resumen "Stabby lambdas no puede aceptar argumentos en Ruby 1.9"? Esto no es exacto, al menos para 1.9.3 - se permiten argumentos.
Kelvin
3

->(x) { ... }es el mismo que lambda { |x| ... }. Crea una lambda. Ver Kernel # lambda Un lambda es un tipo de proceso, uno que garantiza que el número de parámetros que se le pasan es correcto. Vea también Proc :: new y Kernel # proc .

Cary Swoveland
fuente