Обычно это называется деструктурирующим связыванием в функциональных языках (у которых нет назначений) и деструктурирующим назначением в императивных языках.
Некоторые языки предоставляют подмножества этой функции, а затем называют ее чем-то другим.Например, в 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) }
}
}