Erlang ets:选择子列表
Posted
技术标签:
【中文标题】Erlang ets:选择子列表【英文标题】:Erlang ets:select sublist 【发布时间】:2021-01-19 03:05:13 【问题描述】:在 Erlang 中有没有办法在 ets 表上创建一个选择查询,它将获取所有包含搜索文本的元素?
ets:select(Table,
[ %% Match spec for select query
'_', #movie_datagenre = "Drama" ++ '_' , _ = '_', % Match pattern
[], % Guard
['$_'] % Result
]) ;
这段代码只给了我开始(=前缀)和所需文本(文本=“戏剧”)的数据,但问题是我还需要包含数据的结果,像这个例子:
#movie_datagenre = "动作、剧情"
我试图把守卫换成那样的东西-
'_', #movie_datagenre = '$1', _='_', [string:str('$1', "Drama") > 0] ...
但问题是它不是一个合格的守卫表达式。
感谢您的帮助!
【问题讨论】:
【参考方案1】:这是不可能的。您需要将数据结构设计为可被保护表达式搜索,例如:
-record(movie_data, genre, name).
-record(genre, comedy, drama, action).
example() ->
Table = ets:new('test', [keypos,2]),
ets:insert(Table, #movie_dataname = "Bean",
genre = #genrecomedy = true),
ets:insert(Table, #movie_dataname = "Magnolia",
genre = #genredrama = true),
ets:insert(Table, #movie_dataname = "Fight Club",
genre = #genredrama = true, action = true),
ets:select(Table,
[#movie_datagenre = #genredrama = true, _ = '_', _ = '_',
[],
['$_']
]).
【讨论】:
但是说我想看蝙蝠侠的所有电影,我每次都需要搜索特定的标题......所以没有办法这样做,除非我将ETS转换为列表并使用列表推导? @OmerLux:没错。 那么如果我需要使用列表,那么在函数的参数中传递什么更有效(在内存和运行时间方面)?列表还是 ETS 表?以上是关于Erlang ets:选择子列表的主要内容,如果未能解决你的问题,请参考以下文章