小编Pea*_*mes的帖子

Elixir 返回实现者结构类型的行为

我有一个行为来抽象解析各种 Phoenix 端点的 URL 查询参数。它看起来像这样:

defmodule Query do
  @callback from_query_params(params :: %{optional(String.t()) => any()}) ::
              {:ok, parsed :: struct} | {:error, reason :: atom}
end
Run Code Online (Sandbox Code Playgroud)

一个简单的实现如下所示:

defmodule SearchQuery do
  @moduledoc "Parses URL query params for search endpoint"
  @behaviour Query

  @enforce_keys [:search_term]
  defstruct @enforce_keys

  @typespec t :: %__MODULE__{search_term: String.t()}

  @impl Query
  def from_query_params(%{"query" => query}) when query != "" do
    {:ok, %__MODULE__{search_term: query}}
  end

  def from_query_params(_), do: {:error, :missing_search_term}
end
Run Code Online (Sandbox Code Playgroud)

在这里我真正想说的是:

  • 实现模块应该提供一个结构(调用它t()
  • 成功类型from_query_params/1应该使用struct t(),而不仅仅是任何结构 …

elixir dialyzer typespec

1
推荐指数
1
解决办法
293
查看次数

标签 统计

dialyzer ×1

elixir ×1

typespec ×1