ruby - 是否可以在 Ruby 中反转 splat?

标签 ruby operators inverse 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)),没有意义。 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]]
    

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

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

关于ruby - 是否可以在 Ruby 中反转 splat?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34638074/

相关文章:

Ruby 类 << abcd 语法

ruby-on-rails - Ruby 三元运算符 if else

java - += 运算符不适用于字符串

swift - 如何在 Swift 中使用范围内的负数?

jquery - 获取 jQuery .filter() 结果的相反/相反结果

iOS CoreData 与自身的反向关系

ruby-on-rails - 事件记录 : How can I get all of a user's cars without including those that have not been saved?

ruby-on-rails - 获取自连接对象及其子对象上的所有关联对象

java - Java 中 =+ 运算符的用途是什么?

php - PHP 中 preg_quote 的倒数