@derive模块属性的具体语法是什么?在哪里明确记录?

时间:2019-01-03 15:25:22

标签: elixir

我希望它会被记录在Module中,可能引用了struct,但并不高兴。看到它与单个或一个参数列表一起使用。到目前为止我能找到的所有变化:

我发现的唯一提及@derive的地方:


不确定我是否只是忽略了某些内容,因此没有提出问题或请求请求。

1 个答案:

答案 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,而optionsterm,将作为第三个论点
  • protocol(其中protocol的定义如上-原子描述协议模块)与{protocol, []}相同
  • 对于单个派生模块,您可以省略将所有内容包装在列表中并直接使用定义

这样,您的示例都可以被重写为“更具描述性的”:

  1. 模块名称列表

    @derive [MyProtocol, Another]
    

    相同
    @derive [{MyProtocol, []}, {Another, []}]
    
  2. 模块名称

    @derive Inspect
    

    相同
    @derive [Inspect]
    

    相同
    @derive [{Inspect, []}]
    
  3. 元组

    @derive {Protocol, key1: :val1, key2: val2}
    

    相同
    @derive [{Protocol, [key1: :val1, key2: val2]}]
    
  4. 元组列表是“规范”形式

我希望这能使所有内容澄清一些。