gpt4 book ai didi

elixir - 访问模块外部的模块属性

转载 作者:行者123 更新时间:2023-12-02 21:11:28 24 4
gpt4 key购买 nike

我在 Elixir 中有这个模块,它有一个属性:

defmodule MyAwesomeModule do
@awesome_number 7

# other stuff...
end

我无法在模块外部访问 @awesome_number。我尝试过使用 Module.get_attribute/2方法,但它抛出此错误:

iex(79)> Module.get_attribute(MyAwesomeModule, :awesome_number)
** (ArgumentError) could not call get_attribute on module MyAwesomeModule because it was already compiled
(elixir) lib/module.ex:1101: Module.assert_not_compiled!/2
(elixir) lib/module.ex:1016: Module.get_attribute/3
<小时/>

所以现在,我将模块属性包装在一个方法中来访问它,但它对我来说并没有真正的意义。我可以简单地使用该方法并停止使用该属性:

defmodule MyAwesomeModule do
@awesome_number 7

def awesome_number, do: @awesome_number

# other stuff...
end

所以我的问题是,有更好/正确的方法吗?

最佳答案

据我所知,无法访问给定模块之外的模块属性。定义一个函数来公开模块属性是可行的方法,这正是您已经在做的事情。

仍然可能有充分的理由保留模块属性,而不是仅仅使用没有模块属性的函数。这取决于上下文。请记住,存储在模块属性中的值是在编译时计算的。话虽这么说,您可能有不同的原因使用不使用模块属性。让我们看一下以下示例:

如果 awesome_number 必须在每次访问时随机生成,那么您必须只使用一个函数。

如果需要计算awesome_number(长时间)并且不必更改其值,那么使用模块属性+函数来公开它是可行的方法。

编辑:

我之前所说的模块属性还有更多内容。它们的表现不仅仅是功能。以下是 elixir 文档中的示例和引用:

defmodule MyServer do
@my_data 14
def first_data, do: @my_data
@my_data 13
def second_data, do: @my_data
end

MyServer.first_data #=> 14
MyServer.second_data #=> 13

Notice that reading an attribute inside a function takes a snapshot of its current value. In other words, the value is read at compilation time and not at runtime. As we are going to see, this makes attributes useful to be used as storage during module compilation.

将它们与 Module.register_attribute/3 ( https://hexdocs.pm/elixir/Module.html#register_attribute/3 ) 一起使用,尤其是与 accumulate: true 选项一起使用,可以使它们在更多方面发挥作用。

我想说的是,它们比仅仅用作常量更有用。

关于elixir - 访问模块外部的模块属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37713244/

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