查看源码 proplists (stdlib v6.2)
属性列表的支持函数。
属性列表是普通的列表,其中包含以下形式的条目:要么是元组,其第一个元素是用于查找和插入的键;要么是原子,它们是元组 {Atom, true}
的简写。(列表中允许其他项,但此模块会忽略它们。)如果列表中某个键存在多个条目,则第一次出现通常会覆盖任何后续条目(与元组的元数无关)。
属性列表可用于表示继承的属性,例如传递给函数的选项,用户可以在其中指定覆盖默认设置的选项、对象属性、注释等等。
如果两个键匹配 (=:=
),则认为它们相等。也就是说,数字按字面值进行比较,而不是按值进行比较,因此,例如,1
和 1.0
是不同的键。
摘要
函数
类似于 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
。
创建简单键/值属性的规范形式(最小)表示。如果 Value
为 true
且 Key
为原子,则返回 Key
,否则返回元组 {Key, Value}
。
将 List
分区为子列表列表和一个余数。
替换属性的键。对于 ListIn
中的每个条目,如果它与某个键 K1
关联,并且 Aliases
中出现 {K1, K2}
,则该条目的键将更改为 K2
。如果同一个 K1
在 Aliases
中出现多次,则仅使用第一次出现的键。
替换布尔值属性的键,同时对其值求反。
将属性列表 List
转换为映射。
在应用 Stages
中给出的规范化之后,将属性列表 List
转换为映射。
将 ListIn
中所有出现的原子展开为元组 {Atom, true}
。
类型
函数
-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]
最小化列表中所有条目的表示。这等效于 [property(P) || P <- ListIn]
。
另请参阅 property/1
、unfold/1
。
从 List
中删除与 Key
关联的所有条目。
-spec expand(Expansions, ListIn) -> ListOut when Expansions :: [{Property :: property(), Expansion :: [term()]}], ListIn :: [term()], ListOut :: [term()].
将特定属性扩展为相应的属性集(或其他项)。
对于 Expansions
中的每一对 {Property, Expansion}
:如果 E
是 ListIn
中第一个与 Property
具有相同键的条目,并且 E
和 Property
具有等效的规范形式,则 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
。
-spec from_map(Map) -> List when Map :: #{Key => Value}, List :: [{Key, Value}], Key :: term(), Value :: term().
将映射 Map
转换为属性列表。
类似于 get_value/2
,但返回 List
中所有条目 {Key, Value}
的值列表。如果不存在此类条目,则结果为空列表。
返回布尔键/值选项的值。如果 lookup(Key, List)
将产生 {Key, true}
,则此函数返回 true
,否则返回 false
。
另请参阅 get_value/2
、lookup/2
。
返回 List
中使用的键的无序列表,不包含重复项。
-spec get_value(Key, List, Default) -> term() when Key :: term(), List :: [term()], Default :: term().
返回 List
中简单键/值属性的值。如果 lookup(Key, List)
将产生 {Key, Value}
,则此函数返回相应的 Value
,否则返回 Default
。
如果 List
包含至少一个与 Key
关联的条目,则返回 true
,否则返回 false
。
返回 List
中与 Key
关联的第一个条目(如果存在),否则返回 none
。对于列表中的原子 A
,元组 {A, true}
是与 A
关联的条目。
返回 List
中与 Key
关联的所有条目的列表。如果不存在此类条目,则结果为空列表。
另请参阅 lookup/2
。
-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
。
创建属性的规范形式(最小)表示。如果 PropertyIn
是 {Key, true}
,其中 Key
是原子,则返回 Key
,否则返回整个项 PropertyIn
。
另请参阅 property/2
。
-spec property(Key, Value) -> Property when Key :: term(), Value :: term(), Property :: atom() | {term(), term()}.
创建简单键/值属性的规范形式(最小)表示。如果 Value
为 true
且 Key
为原子,则返回 Key
,否则返回元组 {Key, Value}
。
另请参阅 property/1
。
-spec split(List, Keys) -> {Lists, Rest} when List :: [term()], Keys :: [term()], Lists :: [[term()]], Rest :: [term()].
将 List
分区为子列表列表和一个余数。
Lists
为 Keys
中的每个键包含一个子列表,顺序对应。每个子列表中元素的相对顺序与原始 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]}
-spec substitute_aliases(Aliases, ListIn) -> ListOut when Aliases :: [{Key, Key}], Key :: term(), ListIn :: [term()], ListOut :: [term()].
替换属性的键。对于 ListIn
中的每个条目,如果它与某个键 K1
关联,并且 Aliases
中出现 {K1, K2}
,则该条目的键将更改为 K2
。如果同一个 K1
在 Aliases
中出现多次,则仅使用第一次出现的键。
例如,substitute_aliases([{color, colour}], L)
将 L
中的所有元组 {color, ...}
替换为 {colour, ...}
,并将所有原子 color
替换为 colour
。
-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)
指定的值。如果同一个 K1
在 Negations
中出现多次,则仅使用第一次出现的键。
例如,substitute_negations([{no_foo, foo}], L)
将 L
中的任何原子 no_foo
或元组 {no_foo, true}
替换为 {foo, false}
,并将任何其他元组 {no_foo, ...}
替换为 foo
。
-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}
-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/2
,to_map/1
。
将 ListIn
中所有出现的原子展开为元组 {Atom, true}
。
另请参阅 compact/1
。