【发布时间】:2013-10-07 03:10:17
【问题描述】:
我们创建一个带有 splatted 参数的方法并在其上调用 Method#parameters:
def splatter(x, *y, z); end
params = method(:splatter).parameters
# => [[:req, :x], [:rest, :y], [:req, :z]]
我正在寻找一个函数f,它将一个参数列表映射到它们对应的变量名上。 该函数应该足够灵活,可以使用任意放置的 splat 参数处理任何其他方法。例如:
args = [:one, :two, :three, :four]
f(params, args)
# => [[:x, :one], [:y, :two], [:y, :three], [:z, :four]]
或类似的东西(翻转元素也可以)。我觉得使用inject 之类的东西一定有一个灵活、优雅的解决方案,但我似乎想不出。
【问题讨论】:
-
有趣的问题。对于任意方法,您可以利用从指令序列对象 (
RubyVM::InstructionSequence.of(method(:splatter))) 中获得的信息来做一些事情。如果您调用to_a,第 12 个元素包含各种参数配置的索引。不幸的是,我太累了,无法再考虑这一点,但希望这可能会有所帮助。 -
很好,我不知道你能做到这一点……我必须深入研究 InstructionSequence 才能看到我能从中得到什么信息。谢谢!
-
如果您正在寻找测试用例,您可能会发现this answer of mine 很有用。