文件在
defstruct
那里:
对于中的每个协议
@derive
列表中,elixir将断言任何协议都有一个实现(不管fallback to any是否为true),并检查任何实现是否定义了
__deriving__/3
回调(通过)
Protocol.derive/3
)
和
协议派生/3
:
如果您的实现通过了选项,或者您正在基于结构生成自定义代码,那么您还需要实现一个定义为
__deriving__(module, struct, options)
以获取已通过的选项。
换句话说,
@派生
:
-
接受形式为的元组列表
{protocol, options}
哪里
protocol
是要调用的协议吗
α-导数~(3)
和
options
是
term
将作为第三个参数传递
-
协议
(何处)
协议
定义如上-描述协议模块的Atom)与
{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]}]
-
元组列表是“规范”形式
我希望这能澄清一切。