Elixir 中如何声明全局常量?

cpp*_*mer 3 elixir

Elixir 似乎是一种很棒的语言。但是声明全局常量的最佳约定是什么?

我希望模块属性可能是最合适的解决方案?

交换下面的 Horizo​​ntal_line 定义可以修复编译错误。

defmodule ElixirTesting do

  horizontal_line = String.duplicate("-", 80)
#  def horizontal_line, do: String.duplicate("-", 80)

  def test_global_constant do
    IO.puts(horizontal_line)
    IO.puts("Console Report Section Title")
    IO.puts(horizontal_line)
    true
  end

end
Run Code Online (Sandbox Code Playgroud)

Eve*_*ett 5

当你思考 Elixir 中的“全局常数”之类的事情时,你必须换个大脑。在其他语言中,您可能会听到“一切都是对象”——在 Elixir 中,您可能会说“一切都是函数”。

实现类似“全局”的“常量”的一种简单方法是在专用模块内定义一些函数,例如

defmodule Constants do
  def pi, do: 3.14
  def timeout, 5_000
  # ... etc...
end
Run Code Online (Sandbox Code Playgroud)

您可以通过像Constants.piorConstants.timeout这样的调用轻松引用其值,或者您可以按照其他人的建议通过元编程进一步完善访问并创建宏。

正如其他人指出的那样,当仅在单个模块内需要值时,模块属性是引入共享值的有用方法。

在许多情况下,依赖应用程序配置是建立已知基线的有用方法,因此您可以依赖简单Application.get_env/3或更严格的方法Application.fetch_env!/2来检索“全局”值。

您可能还会发现定义环境变量来填充应用程序配置很有用,类似于其他语言水合值的方式,例如使用这样的包dotenvy可以让您访问环境变量。