ruby parameters default-value anonymous-function lambda

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