當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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 \\ [])。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。