【发布时间】: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的说法,谢谢!
【问题讨论】:
运行以下代码,
a = [1, 2, 3, 4, 5]
head, *tail = a
p head
p tail
你会得到结果
1
[2, 3, 4, 5]
谁能帮我解释一下head,*tail = a的说法,谢谢!
【问题讨论】:
首先,这是一个并行作业。在 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]
【讨论】:
我根本不了解 Ruby,但我的猜测是该语句将列表 a 拆分为头部(第一个元素)和其余部分(另一个列表),将新值分配给变量 @987654323 @和tail。
这种机制通常被称为(至少在 Erlang 中)pattern matching。
【讨论】:
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。”
【讨论】: