gpt4 book ai didi

elixir - 如何在 Elixir 上定义共享常量

转载 作者:行者123 更新时间:2023-12-04 03:02:33 25 4
gpt4 key购买 nike

我可以定义与模块共享的常量吗?

一般情况下,我们使用模块属性作为模块内部的常量。 http://elixir-lang.github.io/getting-started/module-attributes.html#as-constants

如果我想让常量对其他模块可用,我该怎么做?起初,模块属性仅在模块(1)内可用。我知道我可以使用 function as constant(2)。但如果可能的话,我想用像 3 这样的专用形式来定义常量。

defmodule Sample do
# 1. module attribute(available only inside module)
@private_const_value 1
# 2. function as constant(possible in any rate)
def const_value_func, do: 3
# 3. ideal form(but compile error)
public_const_value = 2
end

defmodule Client do
def foo() do
IO.puts "CONST = #{Sample.@private_const_value}" # compile error
IO.puts "CONST = #{Sample.const_value_func}"
IO.puts "CONST = #{Sample.public_const_value}" # compile error
end
end

后记

我希望常量满足以下要求。

  • 编译时求值
  • 按模块分类(我的意思是常量应该在适当的模块定义)

最佳答案

非模块特定常量通常放在config/foo.exs 中,并通过System.get_env/1Application.get_env/访问2。如果您希望它位于特定模块(而不仅仅是特定应用程序)的下方/内部,原因仅通过给它一个适当的名称并使用上述选项之一无法满足...首先,请确保这是准确的,你有充分的理由,因为我想不出一个。

如果您仍然想要那个,答案是(AFAIK)只是您的选项 2,函数。如果你想要一个专门的表格,用宏来做:

defmacro const([{name, val}]) do
quote do
def unquote(name) do: unquote(val)
end
end

然后你可以在你需要的任何模块中执行 const foo: 87 并导入其中定义了 const 的模块。

或者您可以将每个常量定义为宏而不是函数。缺点:您需要 require 模块。优点:在编译时解析,就像属性一样。尽管没有副作用的 arity 0 函数可能无论如何都会这样做,但我不确定,但这是一个合理的优化。

关于elixir - 如何在 Elixir 上定义共享常量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47861754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com