2010-10-17 135 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)))) 

也可以使用相同的技术来解构嵌套的数据结构或键/值关联的地图。

相关问题