如何在ruby splat中使用块参数?
使用Ruby 2.0.0p247 假设我有一个如何在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 {
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中的符号和参数是特例。