Ruby: Могут ли параметры функции лямбда иметь значения по умолчанию?
Я хочу сделать что-то похожее на это:
def creator()
return lambda { |arg1, arg2 = nil|
puts arg1
if(arg2 != nil)
puts arg2
end
}
end
test = creator()
test('lol')
test('lol', 'rofl')
Я получаю несколько синтаксических ошибок:
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
Это возможно в рубине? Я хочу установить значение по умолчанию для параметра лямбда-функции
Ответы
Ответ 1
В Ruby 1.9+ вы можете использовать любой из lambdas старого стиля или новый синтаксис лямбды стрелки для установки параметра по умолчанию:
ruby-1.9.1-p378 > f = lambda {|x, y=1| puts(x+y) }
=> #<Proc:[email protected](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:[email protected](irb):1 (lambda)>
ruby-1.9.1-p378 > f.call(1)
6
=> nil
ruby-1.9.1-p378 > f.call(1,2)
3
=> nil
Ответ 2
В Ruby 1.8.x вы можете подделать его по строкам:
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:[email protected](irb):2>
>> test.call("foo")
foo
=> nil
>> test.call("foo", "bar")
foo
bar
=> nil
>> test.call("foo", "bar", "baz")
ArgumentError: ArgumentError
Изменить: В приведенном выше примере по умолчанию используется второй аргумент nil
, но если вы хотите иметь другое значение по умолчанию, вы можете назначить arg2
на основе args.size
(например, arg2 = mydefault if args.size < 2
). Аналогично, если у вас есть более двух аргументов, неуказанные будут по умолчанию nil
, если вы сами их не назначили.
Для Ruby 1.9+ см. другие ответы.