【问题标题】:How does this parallel assignment with the splat operator work in Ruby?这种使用 splat 运算符的并行赋值在 Ruby 中是如何工作的?
【发布时间】:2013-10-31 11:19:55
【问题描述】:
letters = ["a", "b", "c", "d", "e"]
first, *second = letters
first  # => "a"
second # => "["b", "c", "d", "e"]

我了解这会产生什么,但无法理解这一点。这基本上是 Ruby 魔法吗?想不出任何其他编程语言可以支持使用 splat 运算符进行这种类型的赋值。

【问题讨论】:

    标签: ruby


    【解决方案1】:

    这在函数式语言中很常见,因此 Ruby 并不孤单。您有一个项目列表,并希望将其分隔为 headtail,以便您可以对列表的第一个元素执行操作。

    这也有效:

    letters = ["a", "b", "c", "d", "e"]
    first, *middle, last = letters
    

    在像 Clojure 这样的函数式语言中,您会看到如下内容:

    (first '(1 2 3)) => 1
    (rest '(1 2 3)) => (2 3)
    

    【讨论】:

    • +1 表示对 FP 的引用,尽管可能值得注意的是,在 FP 中您有链表,因此从它们中提取头尾是一种廉价的操作。不幸的是,使用数组并不那么便宜......
    【解决方案2】:

    这是一个非常有趣的事情,这里详细描述了所有"magical properties"

    例如

    a, *b, c = [1, 2, 3, 4, 5]
    a # => 1
    b # => [2, 3, 4]
    c # => 5
    
    a, (b, c) = [2,[2,[6,7]]]
    a
    => 2
    b
    => 2
    c
    => [6, 7]
    

    【讨论】:

      【解决方案3】:

      我认为它基本上创建了一个数组。看下面的例子:

      > *foo = 1
      > foo
       => [1]
      

      所以这里*second 将创建一个数组并从letters[1..-1] 中提取所有元素。否则它只会将letters[1](即"b")分配给second 变量。

      我相信有人会想出更好的解释,但基本的想法就在这里。

      更多关于splat operator的信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-12-15
        • 1970-01-01
        • 2013-07-04
        • 1970-01-01
        • 1970-01-01
        • 2012-01-24
        • 1970-01-01
        • 2013-10-07
        相关资源
        最近更新 更多