如何在Elixir中为属性保存非平凡值?

时间:2017-04-07 22:03:31

标签: elixir

所以我理解在为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)那么简单,但我很确定相同的概念适用。如果属性不是正确的方法,请告诉我真正的“灵药”方法是什么。

就我而言,我希望能够在整个模块中访问我地图的某些键,而不必将整个地图作为参数传递给每个功能。

谢谢!

1 个答案:

答案 0 :(得分:1)

@values不是变量,而是Module Attributes。默认情况下,它们不存储在模块中,并且该值仅在编译时存在。来自Elixir 'Getting Started' Guide

  

Elixir中的模块属性有三个目的:

     
      
  1. 它们用于注释模块,通常包含用户或VM使用的信息。
  2.   
  3. 它们作为常量工作。
  4.   
  5. 它们用作编译期间使用的临时模块存储。
  6.   

您的代码存在的问题是@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,但是在编译之后它会变成一个常量,所以你将无法修改它(我猜你想要它)。