objects create and ruby syntax

create - Ruby lambda argumentos



ruby object (3)

Este código funciona como se esperaba (no hace nada, incluso no produce advertencias / errores):

l = lambda {|i|} l.call(1)

Este código produce una advertencia (advertencia: varios valores para un parámetro de bloque (0 para 1)):

l = lambda {|i|} l.call

Y este código falla con error (ArgumentError: número incorrecto de argumentos (0 para 2)):

l = lambda {|i, y|} l.call

Pensé que la lambda requiere que todos los argumentos sean pasados.

Y a partir del segundo ejemplo veo que no lo es. ¿Por qué funciona cuando solo se da un argumento y funciona como se espera (falla con un error) con más de un argumento?

PS: ruby ​​1.8.6 (2008-08-11 patchlevel 287) [universal-darwin9.0]

ACTUALIZACIÓN: He comprobado estas muestras con ruby ​​1.9.1p376. Y funciona como se esperaba, el segundo ejemplo también produce un error. Parece que esta es una característica de la versión 1.8 (o <= 1.8)


Cuando un lambda espera argumentos y nosotros no los proporcionamos, o proporcionamos el número incorrecto de argumentos, se lanza una excepción.

l = lambda { |name| puts "Today we will practice #{name} meditation." } l.call ArgumentError: wrong number of arguments (given 0, expected 1)

Podemos usar el método de aridad para averiguar el número de argumentos esperados:

l.arity # Output: => 1

Al igual que los métodos, los lambdas aceptan todos los siguientes tipos de parámetros / argumentos:

  • Parámetros posicionales (requeridos y opcionales)
  • Parámetro splat único (*);
  • Parámetros de palabras clave (requeridos y opcionales);
  • Doble parámetro splat (**);
  • Parámetro explícito de bloque prefijado con un símbolo comercial (&).

Los siguientes ejemplos ilustran la sintaxis de un lambda que toma múltiples tipos de argumentos.

# Stabby syntax l = -> (cushion, meditation="kinhin", *room_items, time:, posture: "kekkafuza", **periods, &p) do p.call end # Regular syntax l = lambda do |cushion, meditation="kinhin", *room_items, time:, posture: "kekkafuza", **periods, &p| p.call end l.call("zafu", "zazen", "zabuton", "incense", time: 40, period1: "morning", period2: "afternoon" ) { puts "Hello from inside the block, which is now a proc." } Output: Hello from inside the block, which is now a proc.

Lambdas maneja los argumentos de la misma manera que los métodos. Hay una explicación completa de todos los tipos de parámetros / argumentos anteriores en esta publicación del blog sobre los métodos.


Las Lambdas son así de extrañas, su comportamiento es diferente cuando tienes menos de dos argumentos. Revisa este artículo para más información.


Este guión le enseñará todo lo que necesita saber sobre cierres en Ruby.

# So, what''s the final verdict on those 7 closure-like entities? # # "return" returns from closure # True closure? or declaring context...? Arity check? # --------------- ----------------------------- ------------------- # 1. block (called with yield) N declaring no # 2. block (&b => f(&b) => yield) N declaring no # 3. block (&b => b.call) Y except return declaring warn on too few # 4. Proc.new Y except return declaring warn on too few # 5. proc <<< alias for lambda in 1.8, Proc.new in 1.9 >>> # 6. lambda Y closure yes, except arity 1 # 7. method Y closure yes