1

例如,当我使用 yield(param) 但传递块 {|p1,p2| 时会导致问题 ...} 有两个参数。如果我不知道什么参数 yield 需要时间,我应该如何防止这种情况?

4

3 回答 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 的优秀博文:

了解 Ruby 块、Procs 和 Lambda

它解释了 Blocks(比如被传入的那个foo() {|p1,p2| ...})就像Proc一样,它不检查传递的参数的数量。但是,Lambda 可以。因此,如果您需要严格检查参数的数量,您可能会从接受方法中的 Block 切换到接受 Lambda 作为方法参数。

于 2013-03-25T05:10:55.960 回答
0

您应该使用 block 参数而不是yield,它提供的信息比yieldarity 更多。

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 回答