代码之家  ›  专栏  ›  技术社区  ›  toraritte

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

  •  2
  • toraritte  · 技术社区  · 6 年前

    我希望它能被记录在 Module ,可能涉及到 struct 但是没有快乐。看到它与单个或一系列参数一起使用。到目前为止我能找到的所有变化:

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


    不确定我是否只是忽略了一些事情,因此没有打开一个问题或拉请求。

    1 回复  |  直到 6 年前
        1
  •  0
  •   Hauleth    6 年前

    文件在 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, []}
    • 对于单派生模块,可以省略将所有内容包装在列表中,直接使用定义。

    因此,您的示例都可以改写为“更具描述性的”,如:

    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. 元组列表是“规范”形式

    我希望这能澄清一切。