2010-10-17 111 views
12

我需要知道某些語言提供的酷炫功能的正確名稱。[foo,bar] = [「foo」,「bar」]功能的名稱是什麼?

供參考:在某些語言中,可以通過爲「變量」結構分配值的結構來執行多個賦值。在問題標題的例子中,它將「foo」分配給foo和「bar」。

+0

很酷的功能?真?從來沒有聽說過,但我覺得它只是令人困惑。很快我們需要一些工具來使代碼「程序員可讀」。 – Damien 2010-10-17 03:56:57

+8

@Damien:哇,反應過度。 – 2010-10-17 03:59:48

+8

@Damien:[blub](http://www.paulgraham.com/avg.html)多少? – 2010-10-17 04:09:02

回答

22

它通常被稱爲解構綁定函數式語言(不賦值)和解構賦值命令式語言。

某些語言提供該功能的子集,然後將其稱爲不同的東西。例如,在Python它與元組,列表或序列,並且被稱爲元組拆包列表拆包序列拆包,在紅寶石,它與(可轉換爲一個陣列或多個對象)陣列的工作原理,是稱爲並行分配

解構綁定可以任意複雜。例如。此(假想的)綁定

[Integer(a), b, 2, c] = some_array 

會的some_array第一元素分配給a,第二元件向b和第四元件c,但如果第一元件是Integer,第三元件是等於2,長度爲4.所以,這甚至包含了一些條件邏輯。

解構綁定是更一般的模式匹配,這是象Haskell,ML,OCaml中,F#,二郎和Scala功能的語言的標準功能的子集。不同之處在於,解構綁定只允許拆開一個結構並將其組件綁定到變量,而模式匹配也可以匹配這些結構中的值,並且可以讓您做出決定,特別是可以在綁定的上下文中運行任意代碼。 (你可以在解構綁定和模式匹配之間看到上面想象的綁定爲中途。)

下面是一個虛構的語言reverse功能,使用模式匹配寫的經典例子:

def reverse(l: List): List { 
    match l { 
    when []    { return [] } 
    when [first :: rest] { return (reverse(rest) :: first) } 
    } 
} 
+0

實際上,在Python中,它適用於任何順序。 – 2010-10-20 11:22:29

+0

@Matthew Flaschen:謝謝。我添加了* Sequence Unpacking *並從描述中刪除了「only」一詞。 – 2010-10-20 11:33:33

+0

我應該在我的回答(更新)和評論中更清楚。元組和列表是Python中的特定類型的序列,因此元組解包和列表解包只是序列解包的特殊情況。 – 2010-10-20 11:40:20

4

這就是所謂的在Ruby和其他語言的並行任務。

3

Perl和PHP稱之爲列表賦值

的Perl:

my ($foo, $bar, $baz) = (1, 2, 3); 

PHP:

list($foo, $bar, $baz) = array(1, 2, 3); 
2

在Erlang中它是......好吧,這不是分配,它的模式匹配(看到,因爲有沒有分配,因此,在Erlang)。

$ erl 
Erlang R14B (erts-5.8.1) [source] [64-bit] [smp:2:2] [rq:2] [async-threads:0] [hipe] [kernel-poll:true] 

Eshell V5.8.1 (abort with ^G) 
1> [H1, H2, H3| Rest] = [1,2,3,4,5]. 
[1,2,3,4,5] 
2> H1. 
1 
3> H2. 
2 
4> H3. 
3 
5> Rest. 
[4,5] 

爲什麼叫做「模式匹配」?因爲它實際上是匹配模式。看:

6> [1,2,3,4,A] = [1,2,3,4,5]. 
[1,2,3,4,5] 
7> A. 
5 
8> [1,2,3,4,A] = [1,2,3,4,6]. 
** exception error: no match of right hand side value [1,2,3,4,6] 

在我們做的第一個什麼實際上相當於一個斷言該列表將與[1,2,3,4]啓動和第五值可以是任何東西,但請其綁定到綁定變量A。在第二個中,我們做了同樣的事情,但A現在被綁定,所以我們正在明確尋找名單[1,2,3,4,5](因爲A現在是5)。

2

在Clojure中,它將被稱爲解構。簡單的例子:

(let [[foo bar] ["foo" "bar"]] 
    (println "I haz" foo "and" bar)) 

它也經常用於函數定義,例如,下面destructures單點參數轉換爲x和y分量:

(defn distance-from-origin [[x y]] 
    (sqrt (+ (* x x) (* y y)))) 

也可以使用相同的技術來解構嵌套的數據結構或鍵/值關聯的地圖。

相關問題