10 Elixir 易犯错误

主要观点:介绍了 Elixir 中的 10 个“陷阱”(gotchas),包括列表变文本、字符列表与字符串的区别、%{}匹配任何 Map、结构体是 Map 但不实现 Access 行为、关键字列表在选项和模式匹配中的尴尬、万物可比较、正确的日期比较、nil["something"]有效、如何使用常量等。同时提到 Elixir 团队已意识到这些问题并在改进,还推荐了相关的库。
关键信息:

  • 列表用 ~c 表示时会被当作字符列表打印为文本,可通过 Enum 函数操作。
  • 单引号字符串是字符列表,双引号字符串是 UTF-8 编码的二进制字符串,一般使用双引号字符串。
  • %{}在模式匹配中总是匹配,可使用 map_size(map) == 0map == %{} 来判断空 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 库来处理比较问题。
阅读 6
0 条评论