2013-10-31 59 views
4
letters = ["a", "b", "c", "d", "e"] 
first, *second = letters 
first # => "a" 
second # => "["b", "c", "d", "e"] 

我明白這是什麼產生的,但是我無法理解這一點。這基本上是紅寶石魔法?無法想象使用splat運算符支持此類賦值的任何其他編程語言。這個與splat操作符並行賦值如何在Ruby中工作?

回答

2

我認爲它基本上創建一個數組。請看下面的例子:

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

所以這裏*second將創建一個數組,並從letters[1..-1]提取所有元素。否則它只會將letters[1],即"b"分配給second變量。

我確定有人會想出更好的解釋,但基本的想法在這裏。

有關splat operator的更多信息。

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) 
+0

+1爲參考FP,但它可能值得注意的是,在FP你有鏈接列表,所以從他們提取頭部和尾部是一個便宜的操作。數組不是很便宜,不幸的是... – tokland

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] 
相關問題