gpt4 book ai didi

erlang - 如何匹配 ets :match against a record in Erlang?

转载 作者:行者123 更新时间:2023-12-04 04:48:31 25 4
gpt4 key购买 nike

我听说在代码中通过元组指定记录是一种不好的做法:我应该总是使用记录字段( #record_name{record_field = something} )而不是普通的元组 {record_name, value1, value2, something} .

但是如何将记录与 ETS 表进行匹配?如果我有一个包含记录的表,我只能匹配以下内容:

ets:match(Table, {$1,$2,$3,something}

很明显,一旦我向记录定义添加了一些新字段,这个模式匹配就会停止工作。

相反,我想使用这样的东西:
ets:match(Table, #record_name{record_field=something})

不幸的是,它返回一个空列表。

最佳答案

问题的原因是执行 #record_name{record_field=something} 时未指定字段的设置。 .这是创建记录的语法,在这里您将创建一个记录/元组,ETS 将其解释为一种模式。当您创建记录时,所有未指定的字段都将获得它们的默认值,无论是在记录定义中定义的还是默认默认值 undefined .

因此,如果您想为字段指定特定值,则必须在记录中明确执行此操作,例如 #record_name{f1='$1',f2='$2',record_field=something} .通常在使用记录和 ets 时,您希望将所有未指定的字段设置为 '_' , ets 匹配的“无关变量”。使用特殊的,否则非法的字段名称 _ 对此有一个特殊的语法。 .例如 #record_name{record_field=something,_='_'} .

请注意,在您的示例中,您已将元组中的记录名称元素设置为“$1”。表示记录的元组总是将记录名称作为第一个元素。这意味着当您创建 ets 表时,您应该使用 {keypos,Pos} 设置关键位置。到默认值以外的其他内容 1否则不会有任何索引,更糟糕的是,如果您有一个“set”或“ordered_set”类型的表,您将在表中只得到 1 个元素。要获取记录字段的索引,您可以使用语法 #Record.Field ,在你的例子中 #record_name.record_field .

关于erlang - 如何匹配 ets :match against a record in Erlang?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7594738/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com