簡體   English   中英

這個Elixir訊息是什么意思

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM