首页
学习
活动
专区
工具
TVP
发布

协议 | Protocol

使用协议的功能。

功能

assert_impl!(protocol, base)

检查给定模块是否已加载并且是给定协议的实现。

assert_protocol!(module)

检查给定模块是否已加载,是否为协议。

consolidate(protocol, types)

接收协议和实现列表,并合并给定的协议。

consolidated?(protocol)

回报true如果协议被合并

def(signature)

定义一个新的协议函数

derive(protocol, module, options \ [])

派生protocolmodule与给定的选项

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)

派生protocolmodule给出的选项。

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

扫码关注腾讯云开发者

领取腾讯云代金券