2

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
4

2 回答 2

6
  • 关于*(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]]
    

    逆只能在一对一的映射上定义。

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

于 2016-01-06T16:44:12.997 回答
4

除了sawa的答案之外的一个简单示例:

def inverse_splat(*args)
  args
end

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

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

于 2016-01-06T16:58:31.763 回答