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


Elixir Registry.select用法及代码示例


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

用法:

select(registry, spec)
(从 1.9.0 开始)
@spec select(registry(), spec()) :: [term()]

选择使用完全匹配规范注册的键、pid 和值。

spec 由三部分元组的列表组成,形状为 [{match_pattern, guards, body}]

第一部分,匹配模式,必须是一个元组,它将匹配存储在注册表中的数据结构,即 {key, pid, value} 。原子:_ 可用于忽略给定值或元组元素,而原子:"$1" 可用于临时将模式的一部分分配给变量以进行后续比较。这可以像 {:"$1", :_, :_} 一样组合。

第二部分,守卫,是允许过滤结果的条件列表。每个守卫都是一个元组,它说明了应该由模式的指定部分通过的检查。例如,$1 > 1 保护条件将表示为 {:>, :"$1", 1} 元组。请注意,保护条件仅适用于已分配的变量,如 :"$1":"$2" 等。

第三部分,主体,是返回条目的形状列表。与守卫一样,您可以访问分配的变量,例如 :"$1" ,您可以将其与硬编码值组合以自由调整条目的形状 请注意,元组必须包装在一个额外的元组中。要获得类似 %{key: key, pid: pid, value: value} 的结果格式,假设您在匹配部分按顺序绑定这些变量,您将提供类似 [%{key: :"$1", pid: :"$2", value: :"$3"}] 的主体。像守卫一样,您可以使用:element之类的一些操作来修改输出格式。

不要使用特殊匹配变量 :"$_":"$$" ,因为它们可能无法按预期工作。

请注意,对于具有许多分区的大型注册表,这将是昂贵的,因为它通过连接所有分区来构建结果。

例子

此示例显示如何从注册表中获取所有内容。

iex> Registry.start_link(keys: :unique, name: Registry.SelectAllTest)
iex> {:ok, _} = Registry.register(Registry.SelectAllTest, "hello", :value)
iex> {:ok, _} = Registry.register(Registry.SelectAllTest, "world", :value)
iex> Registry.select(Registry.SelectAllTest, [{{:"$1", :"$2", :"$3"}, [], [{{:"$1", :"$2", :"$3"}}]}])
[{"world", self(), :value}, {"hello", self(), :value}]

获取注册表中的所有键。

iex> Registry.start_link(keys: :unique, name: Registry.SelectAllTest)
iex> {:ok, _} = Registry.register(Registry.SelectAllTest, "hello", :value)
iex> {:ok, _} = Registry.register(Registry.SelectAllTest, "world", :value)
iex> Registry.select(Registry.SelectAllTest, [{{:"$1", :_, :_}, [], [:"$1"]}])
["world", "hello"]

相关用法


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