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

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

4

3 回答 3

3

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

这也有效:

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

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

(first '(1 2 3)) => 1
(rest '(1 2 3)) => (2 3)
于 2013-10-31T11:32:06.127 回答
2

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

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

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

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

有关splat 运算符的更多信息。

于 2013-10-31T11:22:49.563 回答
2

这是一件非常有趣的事情,这里非常详细地描述了所有的“神奇特性”

例如

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]
于 2013-10-31T11:33:12.693 回答