不知道如何创建一个结构,其默认值来自同一模块中的函数。下面是我的例子:
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编译时,它将返回以下内容:
== 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发布于 2014-08-30 12:00:44
您可以利用defstruct只定义一个函数__struct__()的事实来实现这一点,该函数返回一个包含__struct__键的映射:
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{}实例提供一个全新的洗牌牌。
https://stackoverflow.com/questions/25578685
复制相似问题