如何使用splat运算符进行并行赋值在Ruby中工作?

时间:2013-10-31 11:19:55

标签: ruby

letters = ["a", "b", "c", "d", "e"]
first, *second = letters
first  # => "a"
second # => "["b", "c", "d", "e"]

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

3 个答案:

答案 0 :(得分:3)

这在函数式语言中很常见,所以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 :(得分:2)

我认为它基本上创建了一个数组。请看以下示例:

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

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

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

有关splat operator

的更多信息

答案 2 :(得分: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]