elixir - 如何在 Elixir 中声明全局常量?
问题描述
Elixir 似乎是一门很棒的语言。但是声明全局常量的最佳约定是什么?
我希望模块属性可能是最合适的解决方案?
交换下面的 Horizontal_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 中,您可能会说“一切都是函数”。
实现类似“全局”的“常量”的一种简单方法是在专用模块内定义一些函数,例如
defmodule Constants do
def pi, do: 3.14
def timeout, 5_000
# ... etc...
end
您可以通过调用Constants.pi
或Constants.timeout
- 轻松引用其值,或者您可以按照其他人的建议通过元编程进一步完善访问并创建宏。
正如其他人指出的那样,当仅在单个模块内需要值时,模块属性是引入共享值的有用方法。
在许多情况下,依赖应用程序配置是建立已知基线的一种有用方法,因此您可以依赖谦逊Application.get_env/3
或更严格Application.fetch_env!/2
的方式来检索“全局”-ish 值。
您可能还会发现定义环境变量以填充您的应用程序配置很有用,类似于其他语言水合值的方式,例如使用类似的包dotenvy
允许您访问环境变量。
推荐阅读
- javascript - 根据日期输入重定向?
- sql - SQL 重复日期列表,包含开始日期、工作天数、关闭天数和频率
- rust - 为什么为结构实现 Display 添加了对其调用 to_string() 的能力?
- java - 线程 checkChange of Textfield
- python - 无法使用 PyQt 播放 youtube 直播
- node.js - 全局 NPM 包安装的简单 CircleCI 2.0 配置失败
- java - firebase 数据库中子项的值显示为空
- c++ - MRPT CDisplayWindow3D 崩溃,使用 Windows 二进制文件
- java - 为什么我不能使用 ArrayList
作为通用 ArrayList 的参数 方法? - c# - Dynamics 365 CRM Online - 使用不在集合中的字段(尚未更新)