You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Elixir保留属性完整列表有哪些?@impl踩坑后的技术疑问

Elixir保留属性踩坑指南与已知列表

我太懂这种排查半天发现是用了保留属性的崩溃感了!之前我也花了好长时间揪这段代码的问题:

defmodule Test do
  @impl 42
  def foo, do: IO.inspect(@impl)
end

运行后@impl返回nil,折腾半天才反应过来——@impl是Elixir的保留属性,自定义赋值根本不会生效!

关于你想找的完整保留属性列表,确实官方文档没有专门的汇总页,但结合日常开发和官方资料,这些都是需要注意的保留属性:

常用及已确认的保留属性

  • @moduledoc:给整个模块添加文档注释
  • @doc:为紧跟在它后面的函数或宏编写文档
  • @behaviour(注意英式拼写!):指定模块需要实现的OTP行为或自定义行为
  • @before_compile:设置模块编译前的钩子函数,能在编译阶段给模块注入代码
  • @impl:标记函数是某个行为的实现(就是坑你的那个!它有特定用途,不能随便赋值)
  • @spec:为函数定义类型规范,配合Dialyzer做静态分析
  • @type/@typep/@opaque:分别定义公开类型、私有类型和不透明类型
  • @callback:为行为定义必须实现的回调函数规范
  • @macrocallback:为行为定义宏回调的规范
  • @optional_callbacks:标记行为里哪些回调是可选实现的
  • @on_definition:模块内每次定义函数/宏时都会触发的钩子
  • @on_load:模块被加载到虚拟机时执行的函数钩子
  • @vsn:手动指定模块的版本号,默认是模块的MD5哈希值

如果不确定某个属性名是不是保留的,最简单的方法就是写个小测试模块编译试试——要是编译器报错或者属性值不符合预期,大概率就是保留属性了。

内容的提问来源于stack exchange,提问作者intentionally-left-nil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:00:39