Erlang 这个长生不老药的信息是什么意思

Erlang 这个长生不老药的信息是什么意思,erlang,elixir,mnesia,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()-> :mne

我正在写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    
defmodule Connect do
def connect do
node_ap_dev_ejd=:'abc@abc.com'
:net\u adm.ping(节点\u ap)
fbUsersFun=fn(x)->:二进制.part(x,{0,3})==end
f=fn()->:mnesia.dirty_select(:'cz_map',[{{{:cz_map,:'$1',:'''''',:'''''''.:'''},[],[:'$1']})结束)
fbUserList=:rpc.call(node\u ap\u dev\u ejd,:mnesia,:activity,[:async\u dirty,f])
list=Enum.filter(fbUserList,fbUsersFun)
长度(列表)
结束
结束
如果我将代码逐行放入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
**(Protocol.UndefinedError)未为实现协议枚举
{:badrpc,{:EXIT,{:unde,[{#函数,[],[]},{:mnesia_tm,:non_事务,5,[文件:'mnesia_tm.erl',行: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
第二个函数。例如:10:Connect.Connect/0
这意味着没有为数据
{:badrpc,…}
实现

该错误很可能来自以下行:

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时遇到了同样的问题,错误是因为匿名函数“f”,问题是远程节点无法识别该函数,因为它是在另一个节点中创建的

编辑:

我在erlang中解决了这个问题,我将向您展示我在erlang中是如何做到的,我对长生不老药知之甚少,但我确信如果能在erlang中实现,它将在长生不老药中实现

那么这个环节呢,

 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']}]]])
而不是宣布一个匿名的乐趣,你必须这样做

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']}]]])
你可以在这里找到一个清楚的解释


希望这些信息对您有所帮助。

您好,谢谢您的回答。我检查了Elixir文档,发现Enum.filter将处理集合,其中包括元组。在使用案例之后,我发现
:rpc.call(node\u ap\u dev\u ejd,:mnesia,:activity,[:async\u dirty,f])
总是引发“坏rpc错误”。但奇怪的是,如果我直接在shell中运行`“rpc.call(node_ap_dev_ejd,…),它会成功运行。我不知道有什么区别。@PeterHon
Enum.filter/2
不处理集合,因为
Enumerable
协议没有为元组实现。请尝试运行
Enum.filter({1,2},fn(el)->el>1 end)
在IEx中,以便您自己验证:)。谢谢。但是对于case语句,它总是会引发错误。我想知道为什么rpc.call在IEx中工作,而不是在模块中。@PeterHon如果我不得不猜测,我会说一些计时问题:shell中的调用发生“遥远”“因为键入它们需要时间,而正在执行的代码几乎没有延迟。谢谢。同样的猜测。也许我需要在rpc调用之后再安排时间睡眠。但是我认为长生不老药应该处理得很好。你能给你的答案添加更多的细节吗?对不起,我还在处理这个问题,当找到一些线索时,我会发布它