Elixir:struct函数的默认值

tld*_*ldr 4 struct function elixir default-value

可以将结构的默认值变量定义为函数而不是原始值吗?

Ale*_*lik 9

struct字段的默认值是在结构定义时计算的表达式.

证明:

# struct.exs
defmodule M do
  defstruct [a: IO.gets("> ")]
end

# ...

$ iex struct.exs
Erlang/OTP 17 [erts-6.0] ...

> hello
Interactive Elixir (0.13.3-dev) - ...
iex(1)> %M{}
%M{a: "hello\n"}
Run Code Online (Sandbox Code Playgroud)

您可以定义一个将创建结构的函数,并设置其中的一些字段:

# struct.exs
defmodule M do
  defstruct [a: nil]

  def new(val) do
    %M{a: val}
  end
end

# ...

M.new(123)
#=> %M{a: 123}
Run Code Online (Sandbox Code Playgroud)