proplists
proplists
模块
proplists
模块摘要
属性列表的支持功能。
描述
属性列表是普通列表,其中包含元组形式的条目,元素的第一个元素是用于查找和插入的键,或者是元组的缩写{Atom, true}
。(在列表中允许使用其他项,但被模块忽略。)如果某个键的列表中有多个条目,则第一个匹配项通常会在后面覆盖(不考虑元组的元素)。
属性列表对于表示继承的属性很有用,例如传递给函数的选项,用户可以指定覆盖默认设置,对象属性,注释等的选项。
如果两个键匹配(=:=
),则认为它们相等。也就是说,数字进行比较字面上而不是通过值,以便,例如,1
和1.0
是不同的密钥。
数据类型
property() = atom() | tuple()
出口
append_values(Key, ListIn) -> ListOut
类型
与get_all_values/2
类似,但每个值都包含在列表中,除非它本身已经是一个列表。列表的结果列表被连接在一起。这对于“增量”选项通常很有用。
例子:
append_values(a, [{a, [1,2]}, {b, 0}, {a, 3}, {c, -1}, {a, [4]}])
返回:
[1,2,3,4]
compact(ListIn) -> ListOut
类型
最小化列表中所有条目的表示。这相当于[property(P) || P <- ListIn]。
另见property/1
,unfold/1
。
delete(Key, List) -> List
类型
删除与相关联的所有条目Key
从List
。
expand(Expansions, ListIn) -> ListOut
类型
将特定属性扩展为相应的一组属性(或其他术语)。对于每一对{Property, Expansion}
中Expansions
:如果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
。
get_all_values(Key, List) -> term()
类型
类似get_value/2
,但返回值的列表中的所有
条目{Key, Value}
在List
。如果不存在这样的条目,则结果是空列表。
get_bool(Key, List) -> boolean()
类型
返回布尔键/值选项的值。如果lookup(Key, List)
将产生{Key, true}
,则此函数返回true
,否则返回false
。
另见get_value/2
,lookup/2
。
get_keys(List) -> term()
类型
返回List
不包含重复项的无序键列表。
get_value(Key, List) -> term()
类型
相当于get_value(Key, List, undefined)
。
get_value(Key, List, Default) -> term()
类型
返回一个简单的键/值属性的值List
。如果lookup(Key, List)
会屈服{Key, Value}
,则该函数返回相应的Value
,否则Default
。
又见get_all_values/2
,get_bool/2
,get_value/2
,lookup/2
。
is_defined(Key, List) -> boolean()
类型
返回true
如果List
包含相关的至少一个条目Key
,否则false
。
lookup(Key, List) -> none | tuple()
类型
返回与Key
in 关联的第一个条目List
(如果存在),否则返回none
。对于A
列表中的原子,元组{A, true}
是与之相关的条目A
。
又见get_bool/2
,get_value/2
,lookup_all/2
。
lookup_all(Key, List) -> tuple()
类型
返回与Key
in 关联的所有条目的列表List
。如果不存在这样的条目,则结果是空列表。
另见lookup/2
。
normalize(ListIn, Stages) -> ListOut
类型
传递ListIn
通过取代/膨胀级的序列。对于aliases
操作,substitute_aliases/2
使用指定的别名列表应用函数:
- 对于
negations
操作,substitute_negations/2
使用指定的否定列表应用。
- 对于
expand
操作,expand/2
使用指定的扩展列表应用函数。
最终结果会自动压缩(比较compact/1
)。
通常,您想先替换否定,然后替换别名,然后执行一个或多个扩展(有时候您希望在进行主扩展之前预先扩展特定条目)。您可能需要重复替换否定和/或别名,以便在别名和扩展名单的右侧允许使用这些表单。
另见substitute_negations/2
。
property(PropertyIn) -> PropertyOut
类型
创建一个属性的正常形式(最小)表示形式。如果PropertyIn
是{Key, true}
,Key
原子的Key
位置返回,否则返回整个术语PropertyIn
。
另见property/2
。
property(Key, Value) -> Property
类型
创建一个简单的键/值属性的正常形式(最小)表示形式。返回Key
如果Value
是true
和Key
是一个原子,否则一个元组{Key, Value}
被返回。
另见property/1
。
split(List, Keys) -> {Lists, Rest}
类型
分区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]}
substitute_aliases(Aliases, ListIn) -> ListOut
类型
替换属性的键。对于每个条目ListIn
,如果它与一些重要关联K1
,从而{K1, K2}
发生Aliases
,进入的关键是改变K2
。如果同K1
一次出现的次数超过一次Aliases
,则仅使用第一次出现的次数。
例如,substitute_aliases([{color, colour}], L)
替换所有元组{color, ...}
在L
与{colour, ...}
,和所有原子color
具有colour
。
另见normalize/2
,substitute_negations/2
。
substitute_negations(Negations, ListIn) -> ListOut
类型
替换布尔值属性的键并同时取消它们的值。对于每个条目ListIn
,如果它与某些关键字相关联K1
,则{K1, K2}
发生在Negations
:如果该条目是{K1, true}
,则将其替换为{K2, false}
,否则替换为{K2, true}
,从而更改选项的名称,同时否定由其指定的值get_bool(Key,ListIn)
。如果同K1
一次出现的次数超过一次Negations
,则仅使用第一次出现的次数。
例如,substitute_negations([{no_foo, foo}], L)
替换任何原子no_foo
或元组{no_foo, true}
在L
与{foo, false}
和任何其它元组{no_foo, ...}
与{foo, true}
。
又见get_bool/2
,normalize/2
,substitute_aliases/2
。
unfold(ListIn) -> ListOut
类型
将所有出现的原子展开ListIn
为元组{Atom, true}
。