2016-03-17 66 views
0

我運行下面的代碼實現協議:錯誤 - 在靈藥

ExHubic.Request.request({:get, "/account", nil, :hubic}, ExHubic) 

,並得到以下錯誤:

** (Protocol.UndefinedError) protocol ExHubic.Request not implemented for {:get, "/account", nil, :hubic} 
    (ex_hubic) lib/request.ex:1: ExHubic.Request.impl_for!/1 
    (ex_hubic) lib/request.ex:6: ExHubic.Request.request/2 

此錯誤消息建議,我認爲該協議未實現對於定義爲@type t :: {atom, String.t, any, :hubic}ExHubic.Query.Hubic.t類型

這可能是我創建的類型的問題,但我看不到它。

一些背景:

defprotocol ExHubic.Request do 
    @moduledoc false 
    @spec request(query :: ExHubic.Query.t, client :: atom) 
       :: ExHubic.Query.http_query_t 
    def request(query, client) 
end 

defimpl ExHubic.Request, for: ExHubic.Query.Hubic do 
    @spec request(query :: ExHubic.Query.Hubic.t, client :: atom) 
       :: {:ok, ExHubic.Client.response_t} | {:error, ExHubic.Client.response_t} 
    def request({method, uri, params, :hubic} = query, client) do 
    implementation_details 
    end 
end 

defmodule ExHubic.Query do 
    @moduledoc false 
    @type t :: {atom, String.t, any, atom} 
end 

defmodule ExHubic.Query.Hubic do 
    @type t :: {atom, String.t, any, :hubic} 
    @spec account() :: __MODULE__.t 
    def account(), do: {:get, "/account", :nil, :hubic} 
end 

回答

3

有幾個問題在這裏,首先,你正在使用的協議的原子(模塊名稱)。您需要使用內置類型或結構,如http://elixir-lang.org/getting-started/protocols.html#protocols-and-structs中所述。這意味着將defstruct到模塊:

defmodule ExHubic.Query.Hubic do 
    defstruct [:method, :uri, :params, service: :hubic] 
    @type t :: %__MODULE__{method: atom, uri: String.t, params: any, service: :hubic} 
    def account(), do: {:get, "/account", :nil, :hubic} 
end 

defprotocol ExHubic.Request do 
    def request(query, client) 
end 


defimpl ExHubic.Request, for: ExHubic.Query.Hubic do 

    @spec request(Query.t, atom) :: any 
    def request(query, client) do 
    IO.inspect query 
    end 
end 

然後,您可以利用此功能:

ExHubic.Request.request(%ExHubic.Query.Hubic{method: :get, params: nil, service: :hubic, uri: "/account"}, client) 
+0

我碰到了我以前的嘗試的問題。你的答案可能是正確的答案,但我還沒有能夠成功實現這一點。我不會在電腦桌上呆幾周。關於元組不允許的一點是絕對正確的,並且使我走上了正確的道路。但是我還不確定查詢或客戶端應該是第一個參數。當我回到辦公桌時,我需要進一步調查。謝謝。 –

+0

將元組更改爲修復它的結構。爲參考目的:文件:[查詢](https://github.com/stephenmoloney/ex_hubic/blob/master/lib/query/hubic.ex),[協議](https://github.com/stephenmoloney/ex_hubic /blob/master/lib/request.ex),[Protocol Impl](https://github.com/stephenmoloney/ex_hubic/blob/master/lib/request/hubic/request.ex) –