【问题标题】:Erlang ets:select sublistErlang ets:选择子列表
【发布时间】:2021-01-19 03:05:13
【问题描述】:

在 Erlang 中有没有办法在 ets 表上创建一个选择查询,它将获取所有包含搜索文本的元素?

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

这段代码只给了我开始(=前缀)和所需文本(文本=“戏剧”)的数据,但问题是我还需要包含数据的结果,像这个例子:

#movie_data{genre = "动作、剧情" }

我试图把守卫换成那样的东西-

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

但问题是它不是一个合格的守卫表达式。

感谢您的帮助!

【问题讨论】:

    标签: datatables erlang contains ets


    【解决方案1】:

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

    
    -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}}),
        ets:insert(Table, #movie_data{name  = "Magnolia",
                                      genre = #genre{drama = true}}),
        ets:insert(Table, #movie_data{name  = "Fight Club",
                                      genre = #genre{drama = true, action = true}}),
        ets:select(Table,
                   [{#movie_data{genre = #genre{drama = true, _ = '_'}, _ = '_'},
                     [],
                     ['$_']
                    }]).
    

    【讨论】:

    • 但是说我想看蝙蝠侠的所有电影,我每次都需要搜索特定的标题......所以没有办法这样做,除非我将ETS转换为列表并使用列表推导?
    • @OmerLux:没错。
    • 那么如果我需要使用列表,那么在函数的参数中传递什么更有效(在内存和运行时间方面)?列表还是 ETS 表?
    猜你喜欢
    • 2016-10-23
    • 2012-10-17
    • 2016-06-03
    • 2012-10-14
    • 2017-03-01
    • 2015-02-17
    • 2016-09-10
    • 2016-10-27
    • 2010-12-30
    相关资源
    最近更新 更多