Подтвердить что ты не робот

Как называется функция [foo, bar] = [ "foo", "bar" ]?

Мне нужно знать правильное имя для этой классной функции, которую предоставляют некоторые языки.

FYI: на некоторых языках можно выполнять множественные назначения, присваивая структуру значений структуре "переменных". В примере в заголовке вопроса он присваивает "foo" foo и "bar" для bar.

4b9b3361

Ответ 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) }
  }
}

Ответ 3

Он называется параллельным назначением в Ruby и других языках.

Ответ 4

Perl и PHP называют это назначение списка

Perl:

my ($foo, $bar, $baz) = (1, 2, 3);

PHP:

list($foo, $bar, $baz) = array(1, 2, 3);

Ответ 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))))

Вы также можете использовать ту же технику для деструкции вложенных структур данных или ассоциативных карт ключа/значения.