如何用随机常数初始化 Elixir 模块?

Red*_*ron 1 elixir

我知道在 Elixir 中我可以使用随机变量启动一个模块,如下所示:

defmodule MyMod do
  @word = "test"
end
Run Code Online (Sandbox Code Playgroud)

但是是否可以使用类似的随机单词来启动此模块

defmodule MyMod do
  @words = ["test", "hello", "bye"]
  @word = @words[1]
end
Run Code Online (Sandbox Code Playgroud)

或者甚至比这更随机,并且有一个在初始化时被调用的函数,并且有一些更好的随机逻辑来确定起始词?

Eve*_*ett 5

我想澄清之前的评论:是的,你可以使用Enum.random/1例如

defmodule MyMod do
  @words ["test", "hello", "bye"]
  @word Enum.random(@words)
end
Run Code Online (Sandbox Code Playgroud)

或者您可以引用现有函数(例如提供更复杂逻辑的函数)。在这种情况下,该函数需要是动态的,也许像:

defmodule MyMod do
  f = fn -> 
   # do something
  end

  @foo f.()

  # ...
end
Run Code Online (Sandbox Code Playgroud)

或者被调用的函数必须隔离在不同的模块中(因为您无法调用尚未编译的函数/模块)。

在最近的一个示例中,我使用编译时函数从 CSV 文件构建模块数据。

无论哪种情况,您都应该了解此代码的计算将在编译模块时发生,而不是在代码实际运行时发生。这可能是也可能不是您正在寻找的内容:它与在面向对象范例中初始化对象或类的实例时执行的代码不同。

旁注:中的模块属性分配时不带等号:

- @foo = :bar
+ @foo :bar
Run Code Online (Sandbox Code Playgroud)