首页 > 解决方案 > 如何在 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

标签: elixir

解决方案


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

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

defmodule Constants do
  def pi, do: 3.14
  def timeout, 5_000
  # ... etc...
end

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

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

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

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


推荐阅读