¿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}

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 .


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.


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


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.