[foo,bar] = [“foo”,“bar”]功能的名称是什么?

时间:2010-10-17 03:49:51

标签: language-features

我需要知道某些语言提供的这个很酷的功能的正确名称。

仅供参考:在某些语言中,可以通过为“变量”结构分配值结构来执行多项分配。在问题标题的示例中,它将“foo”分配给foo,将“bar”分配给bar。

8 个答案:

答案 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))))

您还可以使用相同的技术来构建嵌套数据结构或键/值关联映射。