Ruby: ¿Pueden los parámetros de la función lambda tener valores por defecto?
parameters default-value (2)
Quiero hacer algo similar a esto:
def creator()
return lambda { |arg1, arg2 = nil|
puts arg1
if(arg2 != nil)
puts arg2
end
}
end
test = creator()
test(''lol'')
test(''lol'', ''rofl'')
Recibo algunos errores de sintaxis:
test.rb:2: syntax error
return lambda { |arg1, arg2 = nil|
^
test.rb:3: syntax error
test.rb:7: syntax error
test.rb:14: syntax error
¿Es esto posible en rubí? Quiero establecer un valor predeterminado para un parámetro en una función lambda
En Ruby 1.8.x puedes simularlo de la siguiente manera:
def creator
lambda do |*args|
raise ArgumentError if args.empty? || args.size > 2
arg1, arg2 = args
puts arg1
puts arg2 unless arg2.nil?
end
end
>> test = creator
=> #<Proc:0x000000010125e138@(irb):2>
>> test.call("foo")
foo
=> nil
>> test.call("foo", "bar")
foo
bar
=> nil
>> test.call("foo", "bar", "baz")
ArgumentError: ArgumentError
Edición: el ejemplo anterior establece por defecto el segundo argumento en nil
, pero si desea tener otro valor predeterminado, puede asignar arg2
basado en args.size
(por ejemplo, arg2 = mydefault if args.size < 2
). De manera similar, si tiene más de dos argumentos, los no especificados se establecerán de forma predeterminada en nil
menos que los asigne usted mismo.
Para Ruby 1.9+ ver otras respuestas.
En Ruby 1.9+, puedes usar cualquiera de las lambdas de estilo antiguo o la nueva sintaxis lambda "flecha" para establecer un parámetro predeterminado:
ruby-1.9.1-p378 > f = lambda {|x, y=1| puts(x+y) }
=> #<Proc:0x000001009da388@(irb):4 (lambda)>
ruby-1.9.1-p378 > f.call(1)
2
=> nil
ruby-1.9.1-p378 > f.call(1,5)
6
=> nil
ruby-1.9.1-p378 > f = ->(a, b=5) { puts(a+b) }
=> #<Proc:0x00000100a0e1b0@(irb):1 (lambda)>
ruby-1.9.1-p378 > f.call(1)
6
=> nil
ruby-1.9.1-p378 > f.call(1,2)
3
=> nil