Ruby: Могут ли параметры лямбда-функции иметь значения по умолчанию? - PullRequest
22 голосов
/ 29 сентября 2010

Я хочу сделать что-то похожее на это:

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

возможно ли это в ruby?я хочу установить значение по умолчанию для параметра лямбда-функции

Ответы [ 2 ]

46 голосов
/ 29 сентября 2010

В Ruby 1.9+ вы можете использовать лямбды старого стиля или новый лямбда-синтаксис "стрелка", чтобы установить параметр по умолчанию:

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 
15 голосов
/ 29 сентября 2010

В 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:0x000000010125e138@(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+ см. Другие ответы.

...