查看源码 proplists (stdlib v6.2)

属性列表的支持函数。

属性列表是普通的列表,其中包含以下形式的条目:要么是元组,其第一个元素是用于查找和插入的键;要么是原子,它们是元组 {Atom, true} 的简写。(列表中允许其他项,但此模块会忽略它们。)如果列表中某个键存在多个条目,则第一次出现通常会覆盖任何后续条目(与元组的元数无关)。

属性列表可用于表示继承的属性,例如传递给函数的选项,用户可以在其中指定覆盖默认设置的选项、对象属性、注释等等。

如果两个键匹配 (=:=),则认为它们相等。也就是说,数字按字面值进行比较,而不是按值进行比较,因此,例如,11.0 是不同的键。

摘要

类型

列表中的属性项

property/0 的列表,也称为 proplist。

函数

类似于 get_all_values/2,但每个值都包装在列表中,除非它本身已经是列表。生成的列表列表会被连接起来。这通常对“增量”选项很有用。

最小化列表中所有条目的表示。这等效于 [property(P) || P <- ListIn]

List 中删除与 Key 关联的所有条目。

将特定属性扩展为相应的属性集(或其他项)。

将映射 Map 转换为属性列表。

类似于 get_value/2,但返回 List所有条目 {Key, Value} 的值列表。如果不存在此类条目,则结果为空列表。

返回布尔键/值选项的值。如果 lookup(Key, List) 将产生 {Key, true},则此函数返回 true,否则返回 false

返回 List 中使用的键的无序列表,不包含重复项。

返回 List 中简单键/值属性的值。如果 lookup(Key, List) 将产生 {Key, Value},则此函数返回相应的 Value,否则返回 Default

如果 List 包含至少一个与 Key 关联的条目,则返回 true,否则返回 false

返回 List 中与 Key 关联的第一个条目(如果存在),否则返回 none。对于列表中的原子 A,元组 {A, true} 是与 A 关联的条目。

返回 List 中与 Key 关联的所有条目的列表。如果不存在此类条目,则结果为空列表。

通过一系列替换/扩展阶段传递 ListIn。对于 aliases 操作,使用指定的别名列表应用函数 substitute_aliases/2

创建属性的规范形式(最小)表示。如果 PropertyIn{Key, true},其中 Key 是原子,则返回 Key,否则返回整个项 PropertyIn

创建简单键/值属性的规范形式(最小)表示。如果 ValuetrueKey 为原子,则返回 Key,否则返回元组 {Key, Value}

List 分区为子列表列表和一个余数。

替换属性的键。对于 ListIn 中的每个条目,如果它与某个键 K1 关联,并且 Aliases 中出现 {K1, K2},则该条目的键将更改为 K2。如果同一个 K1Aliases 中出现多次,则仅使用第一次出现的键。

替换布尔值属性的键,同时对其值求反。

将属性列表 List 转换为映射。

在应用 Stages 中给出的规范化之后,将属性列表 List 转换为映射。

ListIn 中所有出现的原子展开为元组 {Atom, true}

类型

-type property() :: atom() | tuple().

列表中的属性项

-type proplist() :: [property()].

property/0 的列表,也称为 proplist。

函数

链接到此函数

append_values(Key, ListIn)

查看源码
-spec append_values(Key, ListIn) -> ListOut when Key :: term(), ListIn :: [term()], ListOut :: [term()].

类似于 get_all_values/2,但每个值都包装在列表中,除非它本身已经是列表。生成的列表列表会被连接起来。这通常对“增量”选项很有用。

示例

append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])

返回

[1,2,3,4]
-spec compact(ListIn) -> ListOut when ListIn :: [property()], ListOut :: [property()].

最小化列表中所有条目的表示。这等效于 [property(P) || P <- ListIn]

另请参阅 property/1unfold/1

-spec delete(Key, List) -> List when Key :: term(), List :: [term()].

List 中删除与 Key 关联的所有条目。

链接到此函数

expand(Expansions, ListIn)

查看源码
-spec expand(Expansions, ListIn) -> ListOut
                when
                    Expansions :: [{Property :: property(), Expansion :: [term()]}],
                    ListIn :: [term()],
                    ListOut :: [term()].

将特定属性扩展为相应的属性集(或其他项)。

对于 Expansions 中的每一对 {Property, Expansion}:如果 EListIn 中第一个与 Property 具有相同键的条目,并且 EProperty 具有等效的规范形式,则 E 将被 Expansion 中的项替换,并且将从 ListIn 中删除任何具有相同键的后续条目。

例如,以下表达式都返回 [fie, bar, baz, fum]

expand([{foo, [bar, baz]}], [fie, foo, fum])
expand([{{foo, true}, [bar, baz]}], [fie, foo, fum])
expand([{{foo, false}, [bar, baz]}], [fie, {foo, false}, fum])

但是,在以下调用中不会进行任何扩展,因为 {foo, false} 遮蔽了 foo

expand([{{foo, true}, [bar, baz]}], [{foo, false}, fie, foo, fum])

请注意,如果要将原始属性项保留在扩展结果中,则必须将其包含在扩展列表中。插入的项不会递归展开。如果 Expansions 包含多个具有相同键的属性,则仅使用第一次出现的属性。

另请参阅 normalize/2

链接到此函数

from_map(Map)

查看源码 (自 OTP 24.0 起)
-spec from_map(Map) -> List
                  when Map :: #{Key => Value}, List :: [{Key, Value}], Key :: term(), Value :: term().

将映射 Map 转换为属性列表。

链接到此函数

get_all_values(Key, List)

查看源码
-spec get_all_values(Key, List) -> [term()] when Key :: term(), List :: [term()].

类似于 get_value/2,但返回 List所有条目 {Key, Value} 的值列表。如果不存在此类条目,则结果为空列表。

-spec get_bool(Key, List) -> boolean() when Key :: term(), List :: [term()].

返回布尔键/值选项的值。如果 lookup(Key, List) 将产生 {Key, true},则此函数返回 true,否则返回 false

另请参阅 get_value/2lookup/2

-spec get_keys(List) -> [term()] when List :: [term()].

返回 List 中使用的键的无序列表,不包含重复项。

链接到此函数

get_value(Key, List)

查看源码
-spec get_value(Key, List) -> term() when Key :: term(), List :: [term()].

等效于 get_value(Key, List, undefined)

链接到此函数

get_value(Key, List, Default)

查看源码
-spec get_value(Key, List, Default) -> term() when Key :: term(), List :: [term()], Default :: term().

返回 List 中简单键/值属性的值。如果 lookup(Key, List) 将产生 {Key, Value},则此函数返回相应的 Value,否则返回 Default

另请参阅 get_all_values/2get_bool/2get_value/2lookup/2

链接到此函数

is_defined(Key, List)

查看源码
-spec is_defined(Key, List) -> boolean() when Key :: term(), List :: [term()].

如果 List 包含至少一个与 Key 关联的条目,则返回 true,否则返回 false

-spec lookup(Key, List) -> none | tuple() when Key :: term(), List :: [term()].

返回 List 中与 Key 关联的第一个条目(如果存在),否则返回 none。对于列表中的原子 A,元组 {A, true} 是与 A 关联的条目。

另请参阅 get_bool/2get_value/2lookup_all/2

链接到此函数

lookup_all(Key, List)

查看源码
-spec lookup_all(Key, List) -> [tuple()] when Key :: term(), List :: [term()].

返回 List 中与 Key 关联的所有条目的列表。如果不存在此类条目,则结果为空列表。

另请参阅 lookup/2

链接到此函数

normalize(ListIn, Stages)

查看源码
-spec normalize(ListIn, Stages) -> ListOut
                   when
                       ListIn :: [term()],
                       Stages :: [Operation],
                       Operation :: {aliases, Aliases} | {negations, Negations} | {expand, Expansions},
                       Aliases :: [{Key, Key}],
                       Negations :: [{Key, Key}],
                       Expansions :: [{Property :: property(), Expansion :: [term()]}],
                       ListOut :: [term()].

通过一系列替换/扩展阶段传递 ListIn。对于 aliases 操作,使用指定的别名列表应用函数 substitute_aliases/2

  • 对于 negations 操作,使用指定的否定列表应用 substitute_negations/2
  • 对于 expand 操作,使用指定的扩展列表应用函数 expand/2

最终结果会自动压缩(比较 compact/1)。

通常,您希望先替换否定,然后替换别名,然后再执行一个或多个扩展(有时您希望在执行主扩展之前预先扩展特定条目)。您可能希望重复替换否定和/或别名,以允许在别名和扩展列表的右侧使用此类形式。

另请参阅 substitute_negations/2

链接到此函数

property(PropertyIn)

查看源码
-spec property(PropertyIn) -> PropertyOut when PropertyIn :: property(), PropertyOut :: property().

创建属性的规范形式(最小)表示。如果 PropertyIn{Key, true},其中 Key 是原子,则返回 Key,否则返回整个项 PropertyIn

另请参阅 property/2

链接到此函数

property(Key, Value)

查看源码
-spec property(Key, Value) -> Property
                  when Key :: term(), Value :: term(), Property :: atom() | {term(), term()}.

创建简单键/值属性的规范形式(最小)表示。如果 ValuetrueKey 为原子,则返回 Key,否则返回元组 {Key, Value}

另请参阅 property/1

-spec split(List, Keys) -> {Lists, Rest}
               when List :: [term()], Keys :: [term()], Lists :: [[term()]], Rest :: [term()].

List 分区为子列表列表和一个余数。

ListsKeys 中的每个键包含一个子列表,顺序对应。每个子列表中元素的相对顺序与原始 List 中保持一致。Rest 包含 List 中未与任何指定键关联的元素,其原始相对顺序也保持一致。

示例

split([{c, 2}, {e, 1}, a, {c, 3, 4}, d, {b, 5}, b], [a, b, c])

返回

{[[a], [{b, 5}, b],[{c, 2}, {c, 3, 4}]], [{e, 1}, d]}
链接到此函数

substitute_aliases(Aliases, ListIn)

查看源码
-spec substitute_aliases(Aliases, ListIn) -> ListOut
                            when
                                Aliases :: [{Key, Key}],
                                Key :: term(),
                                ListIn :: [term()],
                                ListOut :: [term()].

替换属性的键。对于 ListIn 中的每个条目,如果它与某个键 K1 关联,并且 Aliases 中出现 {K1, K2},则该条目的键将更改为 K2。如果同一个 K1Aliases 中出现多次,则仅使用第一次出现的键。

例如,substitute_aliases([{color, colour}], L)L 中的所有元组 {color, ...} 替换为 {colour, ...},并将所有原子 color 替换为 colour

另请参阅 normalize/2substitute_negations/2

链接到此函数

substitute_negations(Negations, ListIn)

查看源码
-spec substitute_negations(Negations, ListIn) -> ListOut
                              when
                                  Negations :: [{Key1, Key2}],
                                  Key1 :: term(),
                                  Key2 :: term(),
                                  ListIn :: [term()],
                                  ListOut :: [term()].

替换布尔值属性的键,同时对其值求反。

对于 ListIn 中的每个条目,如果它与某个键 K1 关联,并且 Negations 中出现 {K1, K2}:如果该条目是 {K1, true},则将其替换为 {K2, false},否则替换为 K2,从而更改选项的名称并同时否定 get_bool(Key, ListIn) 指定的值。如果同一个 K1Negations 中出现多次,则仅使用第一次出现的键。

例如,substitute_negations([{no_foo, foo}], L)L 中的任何原子 no_foo 或元组 {no_foo, true} 替换为 {foo, false},并将任何其他元组 {no_foo, ...} 替换为 foo

另请参阅 get_bool/2normalize/2substitute_aliases/2

链接到此函数

to_map(List)

查看源码 (自 OTP 24.0 起)
-spec to_map(List) -> Map
                when
                    List :: [Shorthand | {Key, Value} | term()],
                    Map :: #{Shorthand => true, Key => Value},
                    Shorthand :: atom(),
                    Key :: term(),
                    Value :: term().

将属性列表 List 转换为映射。

List 中,简写的原子值将被扩展为 Atom => true 形式的关联。在 List 中,形如 {Key, Value} 的元组将被转换为 Key => Value 形式的关联。其他任何内容都将被静默忽略。

如果同一个键在 List 中多次出现,则结果映射中将包含最接近 List 头部的那个键的值,也就是调用 get_value(Key, List) 所返回的值。

示例

to_map([a, {b, 1}, {c, 2}, {c, 3}])

返回

#{a => true, b => 1, c => 2}
链接到此函数

to_map(List, Stages)

查看源码 (自 OTP 24.0 起)
-spec to_map(List, Stages) -> Map
                when
                    List :: [term()],
                    Stages :: [Operation],
                    Operation :: {aliases, Aliases} | {negations, Negations} | {expand, Expansions},
                    Aliases :: [{Key, Key}],
                    Negations :: [{Key, Key}],
                    Expansions :: [{Property :: property(), Expansion :: [term()]}],
                    Map :: #{term() => term()}.

在应用 Stages 中给出的规范化之后,将属性列表 List 转换为映射。

另请参阅 normalize/2to_map/1

-spec unfold(ListIn) -> ListOut when ListIn :: [term()], ListOut :: [term()].

ListIn 中所有出现的原子展开为元组 {Atom, true}

另请参阅 compact/1