如何防止参数与产量不匹配的情况?

时间:2013-03-25 04:59:58

标签: ruby

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

3 个答案:

答案 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的优秀博客文章:

  

Understanding Ruby Blocks, Procs and 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