我需要知道某些语言提供的酷炫功能的正确名称。[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