Dans elixir, nous avons des cartes:
> map = %{:a => "one", :b => "two"} # = %{a: "one", b: "two"}
> map.a # = "one"
> map[:a] # = "one"
Nous avons également des listes de mots clés:
> 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)
Pourquoi les deux?
Syntaxe? Est-ce parce que les listes de mots-clés ont une syntaxe plus flexible permettant de les définir sans boucles et même sans crochets comme dernier paramètre d'un appel de fonction? Alors pourquoi ne pas donner à Maps ce sucre syntaxique?
Dupliquer les clés? Est-ce parce que les listes de mots clés peuvent avoir des clés en double? Pourquoi voudriez-vous à la fois un accès de style carte et des clés en double?
Performance? Est-ce parce que les listes de mots clés ont de meilleures performances? Alors pourquoi avoir des cartes? Et les cartes ne devraient-elles pas être plus performantes pour rechercher les membres par clé qu'une liste de tuples?
JS Array et Ruby Hash aiment l'apparence? Est-ce que c'est ça?
Je comprends que structurellement ce sont des représentations de données différentes. Il me semble que les listes de mots-clés dans elixir servent à compliquer le langage grâce à une syntaxe exceptionnelle (3 variantes syntaxiques différentes), un chevauchement des cas d'utilisation avec des cartes et un avantage peu clair.
Quel est l'avantage d'utiliser les listes de mots clés?
Le principal avantage des listes de mots clés est une rétrocompatibilité avec les bases de code elixir et erlang existantes.
Ils ajoutent également du sucre de syntaxe s'ils sont utilisés comme arguments de fonctions qui ressemblent par exemple à une syntaxe ruby:
Le principal inconvénient de l'utilisation de listes de mots-clés est qu'il n'est pas possible d'effectuer une correspondance partielle de motif sur celles-ci:
Étendons-le aux arguments de fonction. Imaginons que nous devions gérer une fonction multiclause basée sur une valeur de l'une des options:
Cela n'exécutera jamais
do_special_thing
:Avec des arguments de carte, cela fonctionnera:
la source
Les cartes n'autorisent qu'une seule entrée pour une clé particulière, tandis que les listes de mots clés permettent de répéter la clé. Les cartes sont efficaces (en particulier à mesure qu'elles grandissent) et peuvent être utilisées dans la correspondance de motifs d'Elixir.
En général, utilisez des listes de mots clés pour des éléments tels que les paramètres de ligne de commande et pour transmettre des options, et utilisez des cartes (ou une autre structure de données, le HashDict) lorsque vous voulez un tableau associatif.
la source