如何在ruby splat中使用块参数?

时间:2014-04-23 21:50:11

标签: ruby

使用Ruby 2.0.0p247

说我有def

def foo (a, b, &block):
    bar[[a, b]] = block
end

如果我在此函数中使用splat参数,如何编写块参数?

e.g。

params = [:a, [:2], { |m| m.oo }] # syntax error, unexpected '|', expecting '}'

foo(*params) # how do I make this work?

1 个答案:

答案 0 :(得分:2)

你必须像这样传递:

params = [:a, [:2]]
block = lambda { |m| m.oo }

foo(*params, &block)

这里有一些事情:

  • 该块不必包含在自己的变量中,但比阵列斩波更方便
  • 如果没有语法附加到方法调用
  • ,则必须使用lambda定义块

如果绝对需要将它放在一个数组中,(我认为)你可以这样做:

params = [:a, [:2], lambda { |m| m.oo }]
foo(*(params[0..-1]), &(params.last))

如果你可能有或没有阻止,最容易改变foo:

def foo (a, b, block = nil):
    bar[[a, b]] = block
end

删除&你不能再像这样打电话给foo了:

foo(a,b) {|m| m.oo}

但您可以使用您在问题中初步显示的表单:

params = [:a, [:2], lambda { |m| m.oo }]
foo(*params)

或者像这样:

foo(:a, [:2], lambda { |m| m.oo })

如果您没有提供阻止,则默认为零。