例如,当我使用 yield(param) 但传递块 {|p1,p2| 时会导致问题 ...} 有两个参数。如果我不知道什么参数 yield 需要时间,我应该如何防止这种情况?
问问题
65 次
3 回答
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
于 2013-03-25T05:13:57.250 回答
0
请参阅这篇关于 Ruby Blocks、Procs 和 Lambdas 的优秀博文:
它解释了 Blocks(比如被传入的那个foo() {|p1,p2| ...}
)就像Proc一样,它不检查传递的参数的数量。但是,Lambda 可以。因此,如果您需要严格检查参数的数量,您可能会从接受方法中的 Block 切换到接受 Lambda 作为方法参数。
于 2013-03-25T05:10:55.960 回答
0
您应该使用 block 参数而不是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
于 2013-03-25T05:13:45.383 回答