我需要知道某些語言提供的酷炫功能的正確名稱。[foo,bar] = [「foo」,「bar」]功能的名稱是什麼?
供參考:在某些語言中,可以通過爲「變量」結構分配值的結構來執行多個賦值。在問題標題的例子中,它將「foo」分配給foo和「bar」。
我需要知道某些語言提供的酷炫功能的正確名稱。[foo,bar] = [「foo」,「bar」]功能的名稱是什麼?
供參考:在某些語言中,可以通過爲「變量」結構分配值的結構來執行多個賦值。在問題標題的例子中,它將「foo」分配給foo和「bar」。
它通常被稱爲解構綁定函數式語言(不已賦值)和解構賦值命令式語言。
某些語言提供該功能的子集,然後將其稱爲不同的東西。例如,在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) }
}
}
實際上,在Python中,它適用於任何順序。 – 2010-10-20 11:22:29
@Matthew Flaschen:謝謝。我添加了* Sequence Unpacking *並從描述中刪除了「only」一詞。 – 2010-10-20 11:33:33
我應該在我的回答(更新)和評論中更清楚。元組和列表是Python中的特定類型的序列,因此元組解包和列表解包只是序列解包的特殊情況。 – 2010-10-20 11:40:20
Mozilla稱之爲destructuring assignment。在Python中,它是sequence unpacking;元組拆包是一個常見的特例。
如果您將右側視爲元組,可以將作業視爲一種Tuple Unpacking。
在Python它被稱爲列表或序列拆封:http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences
my_list = ["foo", "bar"]
foo, bar = my_list
這就是所謂的在Ruby和其他語言的並行任務。
Perl和PHP稱之爲列表賦值
的Perl:
my ($foo, $bar, $baz) = (1, 2, 3);
PHP:
list($foo, $bar, $baz) = array(1, 2, 3);
在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
)。
在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))))
也可以使用相同的技術來解構嵌套的數據結構或鍵/值關聯的地圖。
很酷的功能?真?從來沒有聽說過,但我覺得它只是令人困惑。很快我們需要一些工具來使代碼「程序員可讀」。 – Damien 2010-10-17 03:56:57
@Damien:哇,反應過度。 – 2010-10-17 03:59:48
@Damien:[blub](http://www.paulgraham.com/avg.html)多少? – 2010-10-17 04:09:02