主要观点:介绍了 Elixir 中的 10 个“陷阱”(gotchas),包括列表变文本、字符列表与字符串的区别、%{}
匹配任何 Map、结构体是 Map 但不实现 Access 行为、关键字列表在选项和模式匹配中的尴尬、万物可比较、正确的日期比较、nil["something"]
有效、如何使用常量等。同时提到 Elixir 团队已意识到这些问题并在改进,还推荐了相关的库。
关键信息:
- 列表用
~c
表示时会被当作字符列表打印为文本,可通过Enum
函数操作。 - 单引号字符串是字符列表,双引号字符串是 UTF-8 编码的二进制字符串,一般使用双引号字符串。
%{}
在模式匹配中总是匹配,可使用map_size(map) == 0
或map == %{}
来判断空 Map。- 结构体是带有
__struct__
键的特殊 Map,模式匹配和is_map
检查时要注意。 - 结构体不实现 Access 行为,应使用
struct.key
语法访问字段,也可使用Map.get/3
等函数。 - 关键字列表是基于列表的特殊数据结构,顺序重要且键可重复,不太适合作为选项进行模式匹配。
- Elixir 中万物可比较,遵循 Erlang 的术语顺序,但可能导致错误。
- 比较日期应使用
Date.compare/2
函数。 nil["something"]
有效且返回nil
,可用于安全访问嵌套值。- Elixir 中没有真正的常量,可使用模块属性或函数来模拟常量,但模块属性的值可能会改变。
重要细节: - Elixir 1.15 改变了字符列表的语法,减少了混淆。
- 引入了新的
is_non_struct_map/1
守卫来处理结构体与 Map 的匹配问题。 - Elixir 针对 1.17 版本正在解决一些比较相关的问题,如引入类型系统。
hauleth
创建了defconst
库来帮助处理常量相关问题,sabiwara
创建了cmp
库来处理比较问题。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。