协议 | Protocol
协议
使用协议的功能。
摘要
功能
assert_impl!(protocol, base)
检查给定模块是否已加载并且是给定协议的实现。
assert_protocol!(module)
检查给定模块是否已加载,是否为协议。
consolidate(protocol, types)
接收协议和实现列表,并合并给定的协议。
consolidated?(protocol)
回报true
如果协议被合并
def(signature)
定义一个新的协议函数
derive(protocol, module, options \ [])
派生protocol
为module
与给定的选项
extract_impls(protocol, paths)
从给定路径中提取为给定协议实现的所有类型。
extract_protocols(paths)
从给定路径提取所有协议。
功能
assert_impl!(protocol, base)
assert_impl!(module, module) :: :ok | no_return
检查给定模块是否已加载,并且是给定协议的实现。
如果是,则返回:ok
,否则返回ArgumentError
。
assert_protocol!(module)
assert_protocol!(module) :: :ok | no_return
检查给定模块是否已加载,是否为协议。
如果是,则返回:ok
,否则返回ArgumentError
。
consolidate(protocol, types)
consolidate(module, [module]) ::
{:ok, binary} |
{:error, :not_a_protocol} |
{:error, :no_beam_info}
接收协议和实现列表,并合并给定协议。
合并通过改变impl_for
抽象格式的协议来实现快速查找规则。通常,在整合期间使用的实现列表可以借助于extract_impls/2
。
它返回协议字节码的更新版本。通过分析协议属性,可以检查给定的字节码或协议实现是否合并:
Protocol.consolidated?(Enumerable)
如果元组的第一个元素是true
,这意味着协议被合并了。
此函数不会在任何点加载协议,也不会加载编译模块的新字节码。但是,每个实现都必须可用,并且它将被加载。
consolidated?(protocol)
consolidated?(module) :: boolean
返回true
协议是否合并。
def(signature) (macro)
定义一个新的协议函数。
协议不允许直接定义函数,相反,Kernel.def/*
宏被此宏替换,该宏使用适当的回调来定义协议函数。
derive(protocol, module, options \ []) (macro)
派生protocol
为module
给出的选项。
extract_impls(protocol, paths)
extract_impls(module, [charlist | String.t]) :: [atom]
从给定路径中提取为给定协议实现的所有类型。
路径可以是字符列表,也可以是字符串。在内部,它们是作为字符列表处理的,因此将它们作为列表传递避免了额外的转换。
不加载任何实现。
实例
# Get Elixir's ebin and retrieve all protocols
iex> path = :code.lib_dir(:elixir, :ebin)
iex> mods = Protocol.extract_impls(Enumerable, [path])
iex> List in mods
true
extract_protocols(paths)
extract_protocols([charlist | String.t]) :: [atom]
从给定路径提取所有协议。
路径可以是字符列表,也可以是字符串。在内部,它们是作为字符列表处理的,因此将它们作为列表传递避免了额外的转换。
不加载任何协议。
实例
# Get Elixir's ebin and retrieve all protocols
iex> path = :code.lib_dir(:elixir, :ebin)
iex> mods = Protocol.extract_protocols([path])
iex> Enumerable in mods
true