В эликсире есть Карты:
> map = %{:a => "one", :b => "two"} # = %{a: "one", b: "two"}
> map.a # = "one"
> map[:a] # = "one"
У нас также есть списки ключевых слов:
> kl = [a: "one", b: "two"] # = [a: "one", b: "two"]
> kl2 = [{:a, "one"},{:b, "two"}] # = [a: "one", b: "two"]
> kl == kl2 # = true
> kl[:a] # = "one"
> kl.a # = ** (ArgumentError)
Почему оба?
Синтаксис? Это потому, что списки ключевых слов имеют более гибкий синтаксис, позволяющий определять их без фигурных скобок и даже без скобок в качестве последнего параметра вызова функции? Тогда почему бы не дать Maps этот синтаксический сахар?
Повторяющиеся ключи? Это потому, что списки ключевых слов могут иметь повторяющиеся ключи? Зачем вам нужен и доступ к стилю карты, и дублирующиеся ключи?
Производительность? Это потому, что списки ключевых слов более эффективны? Тогда зачем нужны Карты? И не должны ли карты быть более производительными при поиске членов по ключу, чем список кортежей?
JS Array и Ruby Hash похожи на внешний вид? Это оно?
Я понимаю, что структурно это разные представления данных. Мне кажется, что списки ключевых слов в elixir служат для усложнения языка за счет исключительного синтаксиса (3 различных синтаксических варианта), совпадения вариантов использования с картами и неясного преимущества.
В чем преимущество использования списков ключевых слов?
Основное преимущество списков ключевых слов - обратная совместимость с существующей кодовой базой elixir и erlang.
Они также добавляют синтаксический сахар, если используются в качестве аргументов функций, что похоже, например, на синтаксис ruby:
Основным недостатком использования списков ключевых слов является то, что для них невозможно выполнить частичное сопоставление с образцом:
Давайте расширим его до аргументов функции. Представьте, что нам нужно обработать функцию с несколькими исключениями на основе значения одного из параметров:
Это никогда не выполнит
do_special_thing
:С аргументами карты это будет работать:
источник
Карты допускают только одну запись для определенного ключа, тогда как списки ключевых слов допускают повторение ключа. Карты эффективны (особенно по мере их роста), и их можно использовать для сопоставления шаблонов в Elixir.
В общем, используйте списки ключевых слов для таких вещей, как параметры командной строки и для передачи параметров, и используйте карты (или другую структуру данных, HashDict), когда вам нужен ассоциативный массив.
источник