首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自同一模块的Elixir结构默认值

来自同一模块的Elixir结构默认值
EN

Stack Overflow用户
提问于 2014-08-30 11:16:50
回答 1查看 1.2K关注 0票数 1

不知道如何创建一个结构,其默认值来自同一模块中的函数。下面是我的例子:

代码语言:javascript
复制
defmodule Poker.Deck do
  alias Poker.Deck.Card

  @values [:a, :"2", :"3", :"4", :"5", :"6", :"7", :"8", :"9", :"10", :j, :q, :k]
  @suits [:spades, :clubs, :diamonds, :hearts]

  def new do
   (for x <- @values, y <- @suits, do: %Card{value: x, suit: y})
   |> Enum.shuffle
  end

  # Putting this at the top or bottom still doesn't solve the problem...
  defstruct deck: __MODULE__.new, used: [], in_hand: []
end

编译时,它将返回以下内容:

代码语言:javascript
复制
== Compilation error on file lib/poker/deck.ex ==
** (UndefinedFunctionError) undefined function: Poker.Deck.new/0
    Poker.Deck.new()
    lib/poker/deck.ex:14: (module)
    (stdlib) erl_eval.erl:657: :erl_eval.do_apply/6
    (elixir) src/elixir.erl:163: :elixir.erl_eval/2
    (elixir) src/elixir.erl:156: :elixir.eval_forms/4
EN

回答 1

Stack Overflow用户

发布于 2014-08-30 12:00:44

您可以利用defstruct只定义一个函数__struct__()的事实来实现这一点,该函数返回一个包含__struct__键的映射:

代码语言:javascript
复制
defmodule Poker.Deck do
  alias Poker.Deck.Card

  @values [:a, :"2", :"3", :"4", :"5", :"6", :"7", :"8", :"9", :"10", :j, :q, :k]
  @suits [:spades, :clubs, :diamonds, :hearts]

  def new do
   (for x <- @values, y <- @suits, do: %Card{value: x, suit: y})
   |> Enum.shuffle
  end

  def __struct__() do
    %{__struct__: __MODULE__, deck: __MODULE__.new(), used: [], in_hand: []}
  end
end

运行此命令将为每个新的%Poker.Deck{}实例提供一个全新的洗牌牌。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25578685

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档