Как называется функция [foo, bar] = ["foo", "bar"]? - PullRequest
13 голосов
/ 17 октября 2010

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

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

Ответы [ 8 ]

23 голосов
/ 17 октября 2010

Обычно это называется деструктурирующим связыванием в функциональных языках (у которых нет назначений) и деструктурирующим назначением в императивных языках.

Некоторые языки предоставляют подмножества этой функции, а затем называют ее чем-то другим.Например, в Python он работает с кортежами, списками или последовательностями и называется распаковка кортежей , распаковка списков или распаковка последовательностей , в Ruby он работает с массивами(или объекты, которые могут быть преобразованы в массив) и называется параллельное присваивание .

Разрушение связывания может стать сколь угодно сложным.Например, это (воображаемое) связывание

[Integer(a), b, 2, c] = some_array

назначит первый элемент some_array на a, второй элемент на b и четвертый элемент на c, но только , если первый элемент равен Integer, третий элемент равен 2, а длина равна 4. Таким образом, это даже включает некоторую условную логику.

Разрушающее связывание является подмножеством более* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *1033*, стандартная функциональность таких языков, как Haskell, ML, OCaml, F #, Erlang и Scala.Разница заключается в том, что деструктурирующее связывание позволяет только разбирать структуру и связывать ее компоненты с переменными, тогда как сопоставление с образцом также сопоставляет значения внутри этих структур и позволяет принимать решения, в частности, позволяет запускать произвольный код в контексте связываний.(Вы можете увидеть вышеупомянутую мнимую привязку как середину между деструктурирующим связыванием и сопоставлением с образцом.)

Вот классический пример reverse функции на воображаемом языке, написанный с использованием сопоставления с образцом:

def reverse(l: List): List {
  match l {
    when []              { return [] }
    when [first :: rest] { return (reverse(rest) :: first) }
  }
}
6 голосов
/ 17 октября 2010

В Python это называется распаковкой списка или последовательности: http://docs.python.org/tutorial/datastructures.html#tuples-and-sequences

my_list = ["foo", "bar"]
foo, bar = my_list
4 голосов
/ 17 октября 2010

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

3 голосов
/ 17 октября 2010

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

Perl:

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

PHP:

list($foo, $bar, $baz) = array(1, 2, 3);
2 голосов
/ 07 апреля 2011

В 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))))

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

2 голосов
/ 17 октября 2010

В Эрланге это ... ну, это не присвоение, это сопоставление с образцом (видя, что в Эрланге, как таковое, назначения нет)?Потому что это на самом деле соответствует шаблонам.Посмотрите:

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).

2 голосов
/ 17 октября 2010

Если вы рассматриваете правую часть в виде кортежа, можно рассматривать назначение как Распаковка кортежей .

2 голосов
/ 17 октября 2010

Mozilla называет это деструктивным назначением .В Python это последовательность распаковки ;Распаковка кортежей является частным частным случаем.

...