letters = ["a", "b", "c", "d", "e"]
first, *second = letters
first # => "a"
second # => "["b", "c", "d", "e"]
我明白這是什麼產生的,但是我無法理解這一點。這基本上是紅寶石魔法?無法想象使用splat運算符支持此類賦值的任何其他編程語言。這個與splat操作符並行賦值如何在Ruby中工作?
letters = ["a", "b", "c", "d", "e"]
first, *second = letters
first # => "a"
second # => "["b", "c", "d", "e"]
我明白這是什麼產生的,但是我無法理解這一點。這基本上是紅寶石魔法?無法想象使用splat運算符支持此類賦值的任何其他編程語言。這個與splat操作符並行賦值如何在Ruby中工作?
我認爲它基本上創建一個數組。請看下面的例子:
> *foo = 1
> foo
=> [1]
所以這裏*second
將創建一個數組,並從letters[1..-1]
提取所有元素。否則它只會將letters[1]
,即"b"
分配給second
變量。
我確定有人會想出更好的解釋,但基本的想法在這裏。
有關splat operator的更多信息。
這在函數式語言中很常見,所以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]
+1爲參考FP,但它可能值得注意的是,在FP你有鏈接列表,所以從他們提取頭部和尾部是一個便宜的操作。數組不是很便宜,不幸的是... – tokland