Elixir原子的不同形式:Map、函数参数、关键字列表键属性疑问咨询
Elixir 不同位置冒号写法的原子规则说明
Map 字面量中 kkey: "success" 的键是什么
这里的kkey本质就是标准原子:kkey,和单独声明的原子没有任何区别。
这是Elixir提供的编译期语法糖:在Map、结构体的字面量定义场景下,把冒号放在标识符后面作为键的后缀时,编译器会自动把这个键转换为对应名称的原子。
比如下面两种写法生成的Map完全等价,没有任何语义或性能差异:
# 语法糖写法 %{ kkey: "success" } # 原生写法 %{ :kkey => "success" }
注意:这个语法糖仅支持原子键的场景,如果键是字符串、数字等其他类型,必须使用
=>的原生写法,比如%{"name" => "test"}就不能写成%{"name": "test"},否则会触发语法错误。
IO.inspect(some_variable, label: "value of some_variable") 里的 label: 是原子吗
是的,这里的label就是原子:label。
这个写法是关键字列表的语法糖。关键字列表的底层结构是存储了二元组的列表,每个二元组的第一个元素是键,第二个是值,完整的原生写法是:
[{:label, "value of some_variable"}]
当函数调用的最后一个参数使用后缀冒号的键值对形式时,编译器会自动把这部分内容解析为对应的关键字列表,最终传入函数的参数和手写原生关键字列表的效果完全一致。
关键字列表的所有键都是原子吗
可以从两个层面理解:
- 从设计约定上:关键字列表的官方使用场景就是承载原子键的可选参数,Elixir所有内置函数接收的关键字参数,键基本都是原子,这也是社区通用的编码规范。
- 从底层实现上:关键字列表本质只是元组组成的普通列表,没有语法层面的强制规则要求键必须是原子——理论上你完全可以写出键是字符串、数字的关键字列表,比如
[{"name": "demo", 123: 456}]是可以正常编译运行的,但这种写法不符合通用编码习惯,而且前面提到的后缀冒号语法糖,只支持原子键的场景。
内容的提问来源于stack exchange,提问作者iyerland
相关产品推荐
相关产品推荐

