Ruby:lambda 函数参数可以有默认值吗?
Posted
技术标签:
【中文标题】Ruby:lambda 函数参数可以有默认值吗?【英文标题】:Ruby: Can lambda function parameters have default values? 【发布时间】:2011-04-18 14:15:16 【问题描述】:我想做类似的事情:
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
这在红宝石中可能吗?我想将参数的默认值设置为 lambda 函数
【问题讨论】:
lambda |arg1, arg2*|
【参考方案1】:
在 Ruby 1.9+ 中,您可以使用旧式 lambda 或新的“箭头”lambda 语法来设置默认参数:
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
【讨论】:
小心,传递 nil 不会触发默认值: 在 Ruby 1.9.3 中,在 stabby lamba 和括号f -> (x = 123) ...
之间放置一个空格时出现语法错误。没有空格 f ->(x = 123) ...
也可以正常工作。
for l =->(k,v,r=nil)
在 a:"A".each &l
时引发 ArgumentError 但在 a:"A"each|k,v| l.call(k,v)
时没有错误【参考方案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:0x000000010125e138@(irb):2>
>> test.call("foo")
foo
=> nil
>> test.call("foo", "bar")
foo
bar
=> nil
>> test.call("foo", "bar", "baz")
ArgumentError: ArgumentError
编辑: 上面的示例默认第二个参数为nil
,但如果您希望有另一个默认值,您可以根据args.size
(例如arg2 = mydefault if args.size < 2
)分配arg2
。同样,如果您有两个以上的参数,则未指定的参数将默认为 nil
,除非您自己分配它们。
对于 Ruby 1.9+,请参阅其他答案。
【讨论】:
以上是关于Ruby:lambda 函数参数可以有默认值吗?的主要内容,如果未能解决你的问题,请参考以下文章
我可以在调用者处将函数参数默认为 __FILE__ 的值吗?