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
相关产品推荐
相关产品推荐

