是否有可能在Ruby中反转splat?

Max*_*ace 2 ruby operators inverse splat

Ruby的splat运算符*可用于合并

def one_argument(*a)
  ...
end

one_argument(1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

或拆分

def multiple_arguments(a, b, c)
  ...
end

multiple_arguments(*[1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

多个值,具体取决于上下文.

是否有可能创建一个充当"反向splat"运算符的方法?为了反过来,运营商必须满足:

inverse_splat(*(foo)) == foo
Run Code Online (Sandbox Code Playgroud)

*(inverse_splat(foo)) == foo
Run Code Online (Sandbox Code Playgroud)

saw*_*awa 6

  • 关于*(inverse_splat(foo)),它没有意义.splatting的结果通常是一系列对象,它们不是对象.这样的东西在Ruby中不存在.

    而在这一点上,你似乎做出的假设,即,inverse_splat并且*可以互换的顺序,结果是错误的.

  • 关于 inverse_splat(*(foo))

    不可能有这样的逆.这是因为splat *内部调用to_a,这不是一对一的映射.

    [[:a, 1], [:b, 2]].to_a
    # => [[:a, 1], [:b, 2]]
    {a: 1, b: 2}.to_a
    # => [[:a, 1], [:b, 2]]
    
    Run Code Online (Sandbox Code Playgroud)

    只能在一对一地图上定义逆.

    如果你忽视这些情况并想继续探索是否有某些东西接近它,那么接近的是[...... ]字面意思.