例如,当我使用yield(param)但是传递一个块{| p1,p2 |时,它会导致问题...}有两个参数。如果我不知道什么参数产生需要花费一些时间,我应该如何防止这种情况?
答案 0 :(得分:1)
在块中使用splat,或者只是传递可能所在的变量并测试它们的定义:
def foo
yield 1, 2, 3
end
foo do |*args|
if 3 == args.length
# ... then I know I'm dealing with 3 args
end
end
foo do |a, b, c, d|
if !d.nil?
# ... then I know i was passed `d`
end
end
答案 1 :(得分:0)
请参阅这篇关于Ruby Blocks,Procs和Lambdas的优秀博客文章:
它解释了块(例如在foo() {|p1,p2| ...}
中传递的那个)就像Proc一样,它不检查传递的参数数量。然而,Lambdas确实如此。因此,如果您需要严格检查参数的数量,您可能会从接受方法中的Block切换到接受Lambda作为方法参数。
答案 2 :(得分:0)
您应该使用块参数而不是yield
,它提供的信息比yield
更多,例如arity。
def foo *params, &block
...
block.call(*params) if params.length == block.arity
...
end
foo(3){|x| puts x*3} # => 9
foo(3, 4){|x| puts x*3} # => Does not do anything