【发布时间】: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
letters = ["a", "b", "c", "d", "e"]
first, *second = letters
first # => "a"
second # => "["b", "c", "d", "e"]
我了解这会产生什么,但无法理解这一点。这基本上是 Ruby 魔法吗?想不出任何其他编程语言可以支持使用 splat 运算符进行这种类型的赋值。
【问题讨论】:
标签: ruby
这在函数式语言中很常见,因此 Ruby 并不孤单。您有一个项目列表,并希望将其分隔为 head 和 tail,以便您可以对列表的第一个元素执行操作。
这也有效:
letters = ["a", "b", "c", "d", "e"]
first, *middle, last = letters
在像 Clojure 这样的函数式语言中,您会看到如下内容:
(first '(1 2 3)) => 1
(rest '(1 2 3)) => (2 3)
【讨论】:
这是一个非常有趣的事情,这里详细描述了所有"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]
【讨论】:
我认为它基本上创建了一个数组。看下面的例子:
> *foo = 1
> foo
=> [1]
所以这里*second 将创建一个数组并从letters[1..-1] 中提取所有元素。否则它只会将letters[1](即"b")分配给second 变量。
我相信有人会想出更好的解释,但基本的想法就在这里。
更多关于splat operator的信息。
【讨论】: