我希望它会被记录在Module
中,可能引用了struct
,但并不高兴。看到它与单个或一个参数列表一起使用。到目前为止我能找到的所有变化:
模块名称列表,例如
@derive [MyProtocol, Another]
(例如Kernel.defstruct/1
macro doc,
line 65 in
ProtocolTest
(v1.7.4))
模块名称,例如
@derive Inspect
元组,形式为
@derive {Protocol, key1: :val1, key2: val2}
(例如line 550 in InspectTest
(v1.8.0-rc.0),
Phoenix.Param
protocol doc)
元组列表,例如
@derive [{Prot1, :options}, {Prot2, key: :val}]
我发现的唯一提及@derive
的地方:
Kernel.defstruct/1
宏文档中的Inspect
Protocol.derive/3
macro的文档(已添加到#7019中)不确定我是否只是忽略了某些内容,因此没有提出问题或请求请求。
答案 0 :(得分:0)
文档位于defstruct
中
对于
@derive
列表中的每个协议,Elixir会断言任何协议都有该协议的实现(无论回退到true),并检查any实现是否定义了__deriving__/3
回调(通过Protocol.derive/3
)。
还有Protocol.derive/3
:
如果您的实现传递了选项,或者您正在基于该结构生成自定义代码,则还需要实现一个定义为
__deriving__(module, struct, options)
的宏,以获取传递的选项。
换句话说,@derive
:
{protocol, options}
的元组列表,其中protocol
是协议,在该协议上将被称为__deriving__/3
,而options
是term
,将作为第三个论点protocol
(其中protocol
的定义如上-原子描述协议模块)与{protocol, []}
相同这样,您的示例都可以被重写为“更具描述性的”:
模块名称列表
@derive [MyProtocol, Another]
与
相同@derive [{MyProtocol, []}, {Another, []}]
模块名称
@derive Inspect
与
相同@derive [Inspect]
与
相同@derive [{Inspect, []}]
元组
@derive {Protocol, key1: :val1, key2: val2}
与
相同@derive [{Protocol, [key1: :val1, key2: val2]}]
元组列表是“规范”形式
我希望这能使所有内容澄清一些。