【问题标题】:Ruby: Can lambda function parameters have default values?Ruby:lambda 函数参数可以有默认值吗?
【发布时间】: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*|

标签: ruby parameters default-value anonymous-function lambda


【解决方案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 -&gt; (x = 123) {...} 之间放置一个空格时出现语法错误。没有空格 f -&gt;(x = 123) {...} 也可以正常工作。
  • for l =-&gt;(k,v,r=nil){}{a:"A"}.each &amp;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 &lt; 2)分配arg2。同样,如果您有两个以上的参数,则未指定的参数将默认为 nil,除非您自己分配它们。

对于 Ruby 1.9+,请参阅其他答案。

【讨论】:

    猜你喜欢
    • 2014-04-28
    • 2011-04-01
    • 1970-01-01
    • 2015-05-19
    • 1970-01-01
    • 2012-09-13
    • 2023-02-25
    • 2012-07-25
    相关资源
    最近更新 更多