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

如何在ruby splat中使用块参数?,ruby,Ruby,使用Ruby 2.0.0p247 假设我有一个def: def foo (a, b, &block): bar[[a, b]] = block end 如果将splat参数与此函数一起使用,如何对块参数进行编码 e、 g 你必须这样通过考试: params = [:a, [:2]] block = lambda { |m| m.oo } foo(*params, &block) foo(a,b) {|m| m.oo} foo(:a, [:2], lambda {

使用Ruby 2.0.0p247

假设我有一个
def

def foo (a, b, &block):
    bar[[a, b]] = block
end
如果将
splat
参数与此函数一起使用,如何对块参数进行编码

e、 g


你必须这样通过考试:

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

foo(*params, &block)
foo(a,b) {|m| m.oo}
foo(:a, [:2], lambda { |m| m.oo })
这里有几件事:

  • 块不必在它自己的变量中,但这比数组切分更方便
  • 如果没有语法连接到方法调用,则必须使用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:

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

foo(*params, &block)
foo(a,b) {|m| m.oo}
foo(:a, [:2], lambda { |m| m.oo })
但您可以使用您在问题中最初显示的形式:

params = [:a, [:2], lambda { |m| m.oo }]
foo(*params)
或者像这样:

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

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

如果不提供块,它将默认为nil。

因此
lambda
肯定会删除语法错误。但是我仍然想在
splat
中包含该块,但是它给了我一个
错误的参数数(3代表2)
错误。有没有一种方法可以在
splat
中包含该块,或者这是唯一的方法?@Derek:没有一些奇特的数组剪切是不行的。请参见编辑。如果我可能有块,也可能没有块,例如,
params.length
可以是2或3,但如果它有块,它将是3,块将是最后一项。只需探索选项,所以没有办法保留
&block
和可选的block?@Derek:没有。Ruby中的符号和参数是特例。