是否可以在 Ruby 中反转 splat



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

def one_argument(*a)
  ...
end
one_argument(1, 2, 3)

或拆分

def multiple_arguments(a, b, c)
  ...
end
multiple_arguments(*[1, 2, 3])

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

是否可以创建充当"逆 splat"运算符的方法?要充当逆函数,运算符必须满足:

inverse_splat(*(foo)) == foo

*(inverse_splat(foo)) == foo
  • 关于*(inverse_splat(foo)),这是没有意义的。拼接的结果通常是一系列物体,而不是物体。这样的东西在 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]]
    

    逆向只能在一对一地图上定义。

    如果您忽略此类情况并仍想探索是否有接近它的东西,那么接近的事情就是[......]字面意思。

除了sawa的答案之外,还有一个简单的例子:

def inverse_splat(*args)
  args
end
inverse_splat(*nil) #=> []
inverse_splat(*[])  #=> []
inverse_splat(*{})  #=> []
inverse_splat()     #=> []

以上所有方法都以相同的方式调用该方法。无法从方法中区分调用,因此无法重新构造原始对象。

相关内容

  • 没有找到相关文章

最新更新