[英]What is this Elixir message means
我正在编写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
这意味着未为数据{:badrpc, ...}
实现Enumerable
协议 。
该错误最有可能来自以下行:
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
我在使用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])
在二郎是这样的
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']}]]])
您可以在此处找到清晰的说明,可以在erlang消息上发送哪种类型的消息?
希望这些信息对您有所帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.