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 Protocol.extract_protocols用法及代码示例
- Elixir Protocol.consolidate用法及代码示例
- Elixir Protocol.extract_impls用法及代码示例
- Elixir Protocol用法及代码示例
- Elixir Process.monitor用法及代码示例
- Elixir Process.demonitor用法及代码示例
- Elixir Process.delete用法及代码示例
- Elixir Process.whereis用法及代码示例
- Elixir Process.group_leader用法及代码示例
- Elixir Process.put用法及代码示例
- Elixir Process.registered用法及代码示例
- Elixir Process.register用法及代码示例
- Elixir Process.get用法及代码示例
- Elixir Process.exit用法及代码示例
- Elixir Process.unregister用法及代码示例
- Elixir Process.get_keys用法及代码示例
- Elixir Process.sleep用法及代码示例
- Elixir Process.send用法及代码示例
- Elixir Process.spawn用法及代码示例
- Elixir Process.send_after用法及代码示例
- Elixir Process.list用法及代码示例
- Elixir Path.basename用法及代码示例
- Elixir Path.rootname用法及代码示例
- Elixir Path.type用法及代码示例
- Elixir Path.split用法及代码示例
注:本文由纯净天空筛选整理自elixir-lang.org大神的英文原创作品 Protocol.derive(protocol, module, options \\ [])。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。