Erlang ets:选择子列表

问题描述

Erlang中是否有一种方法可以在ets表上创建一个选择查询,该查询获取包含搜索文本的所有元素?

ets:select(Table,[{ %% Match spec for select query
      {'_',#movie_data{genre = "Drama" ++ '_',_ = '_'}},% Match pattern
      [],% Guard
      ['$_']                                                 % Result
  }]) ;

代码仅提供给我以开头(=前缀)为必需文本(文本=“ Drama”)的数据,但是问题是我还需要包含数据的结果,像这个例子:

#movie_data {genre =“ 动作,戏剧 ”}

我试图将后卫换成类似的东西-

{'_',#movie_data{genre = '$1',_='_'}},[string:str('$1',"Drama") > 0] ...

但是问题在于它不是合格的保护表达式。

感谢您的帮助!

解决方法

不可能。您需要将数据结构设计为可由保护表达式搜索,例如:


-record(movie_data,{genre,name}).
-record(genre,{comedy,drama,action}).

example() ->
    Table = ets:new('test',[{keypos,2}]),ets:insert(Table,#movie_data{name  = "Bean",genre = #genre{comedy = true}}),#movie_data{name  = "Magnolia",genre = #genre{drama = true}}),#movie_data{name  = "Fight Club",genre = #genre{drama = true,action = true}}),ets:select(Table,[{#movie_data{genre = #genre{drama = true,_ = '_'},[],['$_']
                }]).