这个Elixir信息是什么意思

时间:2015-04-16 10:53:44

标签: erlang elixir mnesia

我正在编写Elixir以从远程节点获取记录,我已经编写了一个模块,

   defmodule Connect do
      def connect do
      node_ap_dev_ejd = :'abc@abc.com'
      :net_adm.ping(node_ap)

      fbUsersFun = fn(x) -> :binary.part(x,{0,3}) == <<"*ab">> end
      f = fn()-> :mnesia.dirty_select(:'cz_map',[{{:cz_map, :'$1', :'_',:'_',:'_'},[],[:'$1']}]) end

      fbUserList = :rpc.call(node_ap_dev_ejd,:mnesia,:activity,[:async_dirty,f])
      list = Enum.filter(fbUserList ,fbUsersFun)
      length(list)
      end
   end    

我可以运行代码,如果我将它逐行放入iex shell,但是如果我编译代码并运行Connect.connect,则会出现此错误,我不知道它,请建议

** (Protocol.UndefinedError) protocol Enumerable not implemented for 
{:badrpc, {:EXIT, {:undef, [{#Function<1.96315226/0 in Connect.connect/0>, [], []}, {:mnesia_tm, :non_transaction, 5, [file: 'mnesia_tm.erl', line: 738]}]}}}
(elixir) lib/enum.ex:1: Enumerable.impl_for!/1
(elixir) lib/enum.ex:112: Enumerable.reduce/3
(elixir) lib/enum.ex:666: Enum.filter/2
         second_function.ex:10: Connect.connect/0

2 个答案:

答案 0 :(得分:2)

这意味着数据{:badrpc, ...}未实现Enumerable protocol

最有可能的是,这个错误来自这一行:

list = Enum.filter(fbUserList ,fbUsersFun)

在该行中,您尝试过滤fbUserList,我猜是{:badrpc, ...}而不是可枚举。元组不是可枚举的;列表和地图(和其他东西)是。

解决方案可能位于case表达式中,该表达式检查:rpc.call/4返回的结果以防止错误:

case :rpc.call(node_ap_dev_ejd, :mnesia, :activity, [:async_dirty, f]) do
  {:badrpc, _} -> raise "bad rpc error"
  fbUserList   -> Enum.filter(fbUserList, ...) # and so on
end

答案 1 :(得分:0)

我在使用erlang处理mnesia时遇到同样的问题,错误是因为匿名函数“f”,事实是远程节点无法识别该函数,因为它是在另一个节点中创建的。

修改

我设法解决了erlang中的问题,我将告诉你我是如何在erlang中完成的,我对elixir知之甚少,但我确定它是否可以在erlang中完成它将在elixir中完成。

所以这段

 f = fn()-> :mnesia.dirty_select(:'cz_map',[{{:cz_map, :'$1', :'_',:'_',:'_'},[],[:'$1']}]) end

  fbUserList = :rpc.call(node_ap_dev_ejd,:mnesia,:activity,[:async_dirty,f])

在erlang中是这样的

f = fun()-> mnesia:dirty_select(cz_map,[{{cz_map, '$1', '_', '_', '_'},[],['$1']}]) end,
fbUserList = rpc:call(node_ap_dev_ejd, mnesia, activity, [async_dirty, f])

相反,声明一个匿名的乐趣,你必须做这样的事情

fbUserList = rpc:call(node_ap_dev_ejd, mnesia, activity, [async_dirty, mnesia:dirty_select/2, [cz_map, [{{cz_map, '$1', '_', '_', '_'},[],['$1']}]]])

您可以在what kind of types can be sent on an erlang message?

找到明确的解释

我希望这些信息可以帮到你。