Как называется функция [foo, bar] = [ "foo", "bar" ]?
Мне нужно знать правильное имя для этой классной функции, которую предоставляют некоторые языки.
FYI: на некоторых языках можно выполнять множественные назначения, присваивая структуру значений структуре "переменных". В примере в заголовке вопроса он присваивает "foo" foo и "bar" для bar.
Ответы
Ответ 1
Он обычно называется деструктурирующим связыванием в функциональных языках (которые не имеют назначений) и деструктурируя присваивание в императивных языках.
Некоторые языки предоставляют подмножества этой функции, а затем называют ее чем-то другим. Например, в Python он работает с Tuples, List или Sequences и называется распаковкой Tuple, распаковкой List или распаковкой Sequence в Ruby, он работает с массивами (или объектами, которые конвертируются в массив) и называется параллельным назначением.
Связывание деструктурирования может быть сколь угодно сложным. Например. это (мнимое) связывание
[Integer(a), b, 2, c] = some_array
назначил бы первый элемент some_array
- a
, второй элемент - b
, а четвертый элемент - c
, но только если первый элемент равен Integer
, третий элемент равен до 2
, а длина равна 4. Таким образом, это даже включает некоторую условную логику.
Связывание деструктурирования является подмножеством более общего соответствия шаблонов, которое является стандартной функцией функциональных языков, таких как Haskell, ML, OCaml, F #, Erlang и Scala. Разница заключается в том, что связывание destructuring позволяет только отделить структуру и привязать ее компоненты к переменным, тогда как соответствие шаблонов также соответствует значениям внутри этих структур и позволяет принимать решения и, в частности, позволяет запускать произвольный код в контексте привязок. (Вы можете видеть вышеупомянутое воображаемое связывание как на полпути между деструктурированием привязки и сопоставлением шаблонов.)
Здесь классический пример функции reverse
на мнимом языке, написанный с использованием сопоставления с образцом:
def reverse(l: List): List {
match l {
when [] { return [] }
when [first :: rest] { return (reverse(rest) :: first) }
}
}
Ответ 2
В Python он известен как распаковка списка или последовательности: http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences
my_list = ["foo", "bar"]
foo, bar = my_list
Ответ 3
Он называется параллельным назначением в Ruby и других языках.
Ответ 4
Perl и PHP называют это назначение списка
Perl:
my ($foo, $bar, $baz) = (1, 2, 3);
PHP:
list($foo, $bar, $baz) = array(1, 2, 3);
Ответ 5
Mozilla называет это назначение деструктурирования. В Python, последовательность распаковки; распаковка является общим частным случаем.
Ответ 6
Если вы рассматриваете правую часть в качестве кортежа, можно рассмотреть назначение как вид Tuple Unpacking.
Ответ 7
В 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
).
Ответ 8
В Clojure он будет называться деструктурированием. Простой пример:
(let [[foo bar] ["foo" "bar"]]
(println "I haz" foo "and" bar))
Он также часто используется в определениях функций, например. следующие деструктуры одноточечный аргумент в x и y компоненты:
(defn distance-from-origin [[x y]]
(sqrt (+ (* x x) (* y y))))
Вы также можете использовать ту же технику для деструкции вложенных структур данных или ассоциативных карт ключа/значения.