所以我理解在为Elixir中的模块定义属性时,语法为@myvariable 30
但是,在我的情况下,假设我的模块定义如下:
defmodule MyModule do
def add(x,y), do: x + y
@myvariable add(3,4)
def print, do: @myvariable
end
理想情况下,这应打印7,但我得到CompileError: undefined function add/2
在我的特定情况下,我想要存储为属性的值是一个有点大的地图,所以不像add(3,4)
那么简单,但我很确定相同的概念适用。如果属性不是正确的方法,请告诉我真正的“灵药”方法是什么。
就我而言,我希望能够在整个模块中访问我地图的某些键,而不必将整个地图作为参数传递给每个功能。
谢谢!
答案 0 :(得分:1)
@values
不是变量,而是Module Attributes。默认情况下,它们不存储在模块中,并且该值仅在编译时存在。来自Elixir 'Getting Started' Guide:
Elixir中的模块属性有三个目的:
- 它们用于注释模块,通常包含用户或VM使用的信息。
- 它们作为常量工作。
- 它们用作编译期间使用的临时模块存储。
醇>
您的代码存在的问题是@myvariable
编译过程中MyModule
正在设置add(3, 4)
但由于模块尚未编译,因此无法计算add(x, y)
。
最简单的解决方案是在另一个模块中定义defmodule OtherModule do
def add(x, y), do: x + y
end
defmodule MyModule do
@myvariable OtherModule.add(3, 4)
def print, do: @myvariable
end
并从那里调用它:
youtube-dl
你可以similarly define your Map
as a Module attribute,但是在编译之后它会变成一个常量,所以你将无法修改它(我猜你想要它)。