ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Elixir Keyword List 追加指南:`++` 拼接与变量键的陷阱及正确解法

Elixir Keyword List 追加指南:`++` 拼接与变量键的陷阱及正确解法 文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载在 Elixir 中keyword list关键字列表是函数参数、配置项与数据结构中最常用的形式之一。本指南以 TIL 仓库中 append-to-a-keyword-list.md 的记录为核心完整讲解如何用向 keyword list 追加元素重点剖析当键来自变量时如何正确构造新条目这一高频踩坑场景并给出可复制、可运行的代码示例与底层原理说明。读完你将从会拼进阶到拼得对。基础两个 keyword list 可以直接用拼接如果你手头有两个 keyword list直接使用列表拼接运算符即可把它们合并成一个新的 keyword listiex a [a: 1] [a: 1] iex b [b: 2] [b: 2] iex a b [a: 1, b: 2]这里[a: 1]是 Elixir 的语法糖它实际展开为两元素元组的列表[{:a, 1}]。也就是说 keyword list 本质上就是{:atom, value}形式的元组列表只是普通的列表拼接因此两个 keyword list 拼接后依然保持 keyword list 的结构与语义。这也是为什么a b能得到[a: 1, b: 2]而不会破坏条目结构。进阶场景基于变量构建新条目时出现的陷阱静态写法没有问题但一旦进入更程序化的场景——比如你正在根据某个变量的值动态构建要追加的键——事情就会变得微妙iex x :x :x iex c a [x 5] ** (CompileError) iex:5: undefined function x/1 (stdlib) lists.erl:1353: :lists.mapfoldl/3 (stdlib) lists.erl:1354: :lists.mapfoldl/3这里[x 5]被 Elixir 编译器解析成了对名为x的函数的调用即x(5)而实际上x只是一个存放原子:x的变量根本不存在名为x的函数于是在编译期就抛出了undefined function x/1的CompileError。这一点值得展开说明在 Elixir 中foo bar等价于函数调用foo(bar)列表字面量[x 5]内部同样遵循这个语法规则。因为x在这里不是原子字面量没有以:开头编译器就把它当作函数名处理了。只有写成[:x, 5]这种原子字面量形式才不会被误判为函数调用。加个逗号也不行产生的是裸原子 裸值直觉上你可能会想既然[x 5]被当成函数调用那把x和5用逗号隔开不就行了iex c a [x, 5] [{:a, 1}, :x, 5]命令确实能执行但结果完全不符合预期c变成了一个三元素混合列表——第一项是合法的{:a, 1}元组而后面两项分别是裸原子:x和裸整数5。它们没有组成{:x, 5}这样的键值元组因此这个列表已经不再是一个结构良好的 keyword list:x不是{key, value}的 key5也不是任何 key 的 value。这个例子很好地揭示了 keyword list 的本质约束只有元素全部是{atom, value}二元元组的列表才是合法的 keyword list。直接 [atom, value]只是把两个孤立元素塞进列表并不会自动帮你配对。正确解法用花括号构造元组再追加要得到预期的[a: 1, x: 5]关键一步是先用花括号把内部内容包成二元元组再把这个元组作为单个元素追加到a上iex c a [{x, 5}] [a: 1, x: 5]{x, 5}中的x是普通变量求值后得到原子:x于是花括号构造出元组{:x, 5}[{x, 5}]是一个只含单个元组元素的列表a [{x, 5}]拼接后即为[{:a, 1}, {:x, 5}]即 IEx 展示的[a: 1, x: 5]。整个追加操作与[a: 1] [{:x, 5}]完全等价c是一个标准、健康的 keyword list可以继续传给需要 keyword list 参数的函数。延伸keyword list 的配套操作与相关记录掌握追加之后还可以结合本仓库的其他 Elixir 记录把 keyword list 的增删查改串成完整闭环查keyword list 允许同一个 key 出现多次Keyword.get/2只取首次出现的值Keyword.get_values/2才能取回该 key 的全部值详见 all-values-for-a-key-in-a-keyword-list.md。改使用Keyword.put/3可以替换重复键条目——没有重复时直接新增有重复时新值覆盖旧值多个重复条目会被全部替换详见 replace-duplicates-in-a-keyword-list.md。建键当需要批量生成原子键时可以用~w(...)asigil 快速创建原子列表或借助字符串插值动态生成原子分别参见 word-lists-for-atoms.md 与 dynamically-generating-atoms.md。这些记录与本文共同组成了 Elixir 日常开发中 keyword list 的实用操作手册完整索引见 README.md 的 Elixir 分类。小结两个现成的 keyword list 之间用拼接简单直接当键来自变量时[x 5]会被编译器解析为函数调用x(5)而报undefined function x/1加逗号写成[x, 5]则会破坏 keyword list 结构正确做法是用花括号把变量键与值包成二元元组a [{x, 5}]得到结构完整的[a: 1, x: 5]。记住keyword list 本质是{atom, value}元组列表这一点追加操作的各种变体都能迎刃而解。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐Elixir关键字列表Keyword模块的用法Elixir关键字列表Keyword模块的用法 还在为Elixir中的可选参数处理而烦恼吗一文掌握Keyword模块的核心用法让你的代码更加优雅和灵活编程语言编译器标准库语言运行时并发编程Elixir 1.18 中关于 Range 语法变更的技术解析Elixir 1.18 中关于 Range 语法变更的技术解析 在 Elixir 1.18.0 rc.0 版本中开发团队引入了一个关于 Range 语法的重要编程语言编译器标准库语言运行时并发编程5 个 HOMEBREW_ 变量让 brew 变快变省盘Homebrew 环境变量配置与 brew config 自检手册5 个 HOMEBREW_ 变量让 brew 变快变省盘Homebrew 环境变量配置与 brew config 自检手册 一条 brew install 还CLI包管理器上一篇终极指南如何用Universal x86 Tuning Utility免费解锁你的硬件全部潜力下一篇百度网盘高速下载终极解决方案baidu-wangpan-parse解析工具完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表