我需要知道某些语言提供的这个很酷的功能的正确名称。
仅供参考:在某些语言中,可以通过为“变量”结构分配值结构来执行多项分配。在问题标题的示例中,它将“foo”分配给foo,将“bar”分配给bar。
答案 0 :(得分:23)
它通常在函数式语言中被称为 destructuring bind (在命令式语言中没有具有赋值)和解构赋值。
某些语言提供该功能的子集,然后将其称为不同的东西。例如,在Python中,它与元组,列表或序列一起使用,在Ruby中称为元组解包,列表解包或序列解包适用于数组(或可转换为数组的对象),称为并行赋值。
解构绑定可以任意复杂。例如。这个(想象的)绑定
[Integer(a), b, 2, c] = some_array
会将some_array
的第一个元素分配给a
,将第二个元素分配给b
,将第四个元素分配给c
,但仅分配如果第一个元素是Integer
,则第三个元素等于2
,长度为4.因此,这甚至包含一些条件逻辑。
Destructuring bind是更通用的模式匹配的子集,它是Haskell,ML,OCaml,F#,Erlang和Scala等函数式语言的标准特性。不同之处在于,解构绑定只允许您拆分结构并将其组件绑定到变量,而模式匹配也匹配这些结构中的值,并允许您做出决策,特别是允许您在绑定的上下文中运行任意代码。 (你可以在解构绑定和模式匹配之间看到上面的虚构绑定。)
以下是使用模式匹配编写的假想语言中reverse
函数的经典示例:
def reverse(l: List): List {
match l {
when [] { return [] }
when [first :: rest] { return (reverse(rest) :: first) }
}
}
答案 1 :(得分:6)
在Python中,它被称为列表或序列解包:http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences
my_list = ["foo", "bar"]
foo, bar = my_list
答案 2 :(得分:4)
它被称为Ruby和其他语言的并行赋值。
答案 3 :(得分:3)
Perl和PHP称之为列表赋值
的Perl:
my ($foo, $bar, $baz) = (1, 2, 3);
PHP:
list($foo, $bar, $baz) = array(1, 2, 3);
答案 4 :(得分:2)
Mozilla称之为destructuring assignment。在Python中,它是sequence unpacking;元组拆包是一种常见的特殊情况。
答案 5 :(得分:2)
如果您将右侧视为元组,则可以将该分配视为一种Tuple Unpacking。
答案 6 :(得分: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
)。< / p>
答案 7 :(得分:2)
在Clojure中,它将被称为 destructuring 。简单的例子:
(let [[foo bar] ["foo" "bar"]]
(println "I haz" foo "and" bar))
它也常用于函数定义,例如下面将单点参数解构为x和y分量:
(defn distance-from-origin [[x y]]
(sqrt (+ (* x x) (* y y))))
您还可以使用相同的技术来构建嵌套数据结构或键/值关联映射。