当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Elixir Protocol.derive用法及代码示例


Elixir语言中 Protocol.derive 相关用法介绍如下。

用法:

derive(protocol, module, options \\ [])
(宏)

使用给定选项为module 派生protocol

如果您的实现传递了选项,或者您正在基于结构生成自定义代码,您还需要实现一个定义为 __deriving__(module, struct, options) 的宏来获取传递的选项。

例子

defprotocol Derivable do
  def ok(arg)
end

defimpl Derivable, for: Any do
  defmacro __deriving__(module, struct, options) do
    quote do
      defimpl Derivable, for: unquote(module) do
        def ok(arg) do
          {:ok, arg, unquote(Macro.escape(struct)), unquote(options)}
        end
      end
    end
  end

  def ok(arg) do
    {:ok, arg}
  end
end

defmodule ImplStruct do
  @derive [Derivable]
  defstruct a: 0, b: 0
end

Derivable.ok(%ImplStruct{})
#=> {:ok, %ImplStruct{a: 0, b: 0}, %ImplStruct{a: 0, b: 0}, []}

现在可以通过 __deriving__/3 调用显式派生:

# Explicitly derived via `__deriving__/3`
Derivable.ok(%ImplStruct{a: 1, b: 1})
#=> {:ok, %ImplStruct{a: 1, b: 1}, %ImplStruct{a: 0, b: 0}, []}

# Explicitly derived by API via `__deriving__/3`
require Protocol
Protocol.derive(Derivable, ImplStruct, :oops)
Derivable.ok(%ImplStruct{a: 1, b: 1})
#=> {:ok, %ImplStruct{a: 1, b: 1}, %ImplStruct{a: 0, b: 0}, :oops}

相关用法


注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Protocol.derive(protocol, module, options \\ [])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。