【问题标题】:What does this mean in Ruby language?这在 Ruby 语言中是什么意思?
【发布时间】:2011-04-06 19:56:03
【问题描述】:

运行以下代码,

a = [1, 2, 3, 4, 5]
head, *tail = a
p head
p tail

你会得到结果

1
[2, 3, 4, 5]

谁能帮我解释一下head,*tail = a的说法,谢谢!

【问题讨论】:

    标签: ruby splat


    【解决方案1】:

    首先,这是一个并行作业。在 ruby​​ 中你可以写

    a,b = 1,2
    

    a 为 1,b 为 2。你也可以使用

    a,b = b,a
    

    交换值(没有其他语言所需的典型临时变量)。

    星 * 是打包/解包操作符。写作

    a,b = [1,2,3]
    

    将 1 分配给 a 并将 2 分配给 b。通过使用星号,将值 2,3 打包到一个数组中并分配给 b:

    a,*b = [1,2,3]
    

    【讨论】:

      【解决方案2】:

      我根本不了解 Ruby,但我的猜测是该语句将列表 a 拆分为头部(第一个元素)和其余部分(另一个列表),将新值分配给变量 @987654323 @和tail

      这种机制通常被称为(至少在 Erlang 中)pattern matching

      【讨论】:

        【解决方案3】:

        head, *tail = a表示将数组a的第一个元素赋值给head,其余元素赋值给tail

        *,有时称为“splat 运算符”,对数组做了很多事情。当它位于赋值运算符 (=) 的左侧时,如您的示例所示,它的意思是“把剩下的所有东西都拿走”。

        如果您省略了该代码中的 splat,它将改为:

        head, tail = [1, 2, 3, 4, 5]
        p head # => 1
        p tail # => 2
        

        但是,当您将 splat 添加到 tail 时,它的意思是“所有未分配给先前变量 (head) 的东西,都分配给 tail。”

        【讨论】:

        • 不错的答案! :) 但你真的应该改变你的个人资料照片,你看起来像一只过度修饰的贵宾犬;)呵呵
        • 哈哈。我以前没有那个。我会接受它的建议。 :)
        • @banister:他现在的照片(可能和当时不一样)让他看起来像贾斯汀比伯!
        猜你喜欢
        • 2011-07-10
        • 2020-06-29
        • 1970-01-01
        • 2022-01-12
        • 2014-02-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-28
        • 2011-08-27
        相关资源
        最近更新 更多