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


Elixir Registry.match用法及代码示例


Elixir语言中 Registry.match 相关用法介绍如下。

用法:

match(registry, key, pattern, guards \\ [])
(从 1.4.0 开始)
@spec match(registry(), key(), match_pattern(), guards()) :: [{pid(), term()}]

registry 中的给定 key 下返回与 pattern 匹配的 {pid, value} 对。

Pattern 必须是与注册表中存储的值的结构相匹配的原子或元组。原子:_ 可用于忽略给定值或元组元素,而原子:"$1" 可用于将部分模式临时分配给变量以供后续比较。

可选地,可以传递保护条件列表以进行更精确的匹配。每个守卫都是一个元组,它说明了应该由模式的指定部分通过的检查。例如,$1 > 1 保护条件将表示为 {:>, :"$1", 1} 元组。请注意,保护条件仅适用于已分配的变量,如 :"$1":"$2" 等。避免使用特殊匹配变量 :"$_":"$$" ,因为它可能无法按预期工作。

如果没有匹配,将返回一个空列表。

对于唯一的注册表,单个分区查找是必要的。对于重复的注册表,必须查找所有分区。

例子

在下面的示例中,我们在重复注册表中的相同键下注册当前进程,但具有不同的值:

iex> Registry.start_link(keys: :duplicate, name: Registry.MatchTest)
iex> {:ok, _} = Registry.register(Registry.MatchTest, "hello", {1, :atom, 1})
iex> {:ok, _} = Registry.register(Registry.MatchTest, "hello", {2, :atom, 2})
iex> Registry.match(Registry.MatchTest, "hello", {1, :_, :_})
[{self(), {1, :atom, 1}}]
iex> Registry.match(Registry.MatchTest, "hello", {2, :_, :_})
[{self(), {2, :atom, 2}}]
iex> Registry.match(Registry.MatchTest, "hello", {:_, :atom, :_}) |> Enum.sort()
[{self(), {1, :atom, 1}}, {self(), {2, :atom, 2}}]
iex> Registry.match(Registry.MatchTest, "hello", {:"$1", :_, :"$1"}) |> Enum.sort()
[{self(), {1, :atom, 1}}, {self(), {2, :atom, 2}}]
iex> guards = [{:>, :"$1", 1}]
iex> Registry.match(Registry.MatchTest, "hello", {:_, :_, :"$1"}, guards)
[{self(), {2, :atom, 2}}]
iex> guards = [{:is_atom, :"$1"}]
iex> Registry.match(Registry.MatchTest, "hello", {:_, :"$1", :_}, guards) |> Enum.sort()
[{self(), {1, :atom, 1}}, {self(), {2, :atom, 2}}]

相关用法


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