在Elixir中编写属性

时间:2015-11-04 23:43:56

标签: elixir

由于在编译模块后内联属性,我假设它们的值是常量。如果可能,我想根据以前创建的属性定义属性。我也希望能够从外部访问它们,我目前的方法就是这个

@required_fields ~w(email)
@optional_fields ~w(password role name last_name age country)

def required_fields, do: @required_fields
def optional_fields, do: @optional_fields

@all_fields required_fields ++ optional_fields
def all_fields, do: @all_fields

但我收到此错误

  

==文件web / models / user.ex ==上的编译错误   **(CompileError)web / models / user.ex:22:undefined function required_fields / 0       (elixir)扩展宏:内核。@ / 1       web / models / user.ex:22:AristaServer.User(模块)       (elixir)lib / kernel / parallel_compiler.ex:97:Kernel.ParallelCompiler.spawn_compilers / 8中的匿名fn / 4

有什么办法可以达到类似的目的吗?我不想每次都重新计算all_fields列表,看起来很浪费。此外,我不想将这两个列表复制并过去到第三个列表中,看起来容易出错。

2 个答案:

答案 0 :(得分:2)

除非你运行基准测试,否则你对长生不老药中“浪费”的直觉可能是错误的。我知道我所运行的每个基准测试都是如此。 只需这样做,并担心它工作后的速度或速度。

 def all_fields, do: required_fields ++ option_fields

https://en.wikiquote.org/wiki/Donald_Knuth

我的想法是使用Module属性可能更浪费内存,因为它们会转换为代码中的多个项目。如果将它保留在变量中,则只在内存中创建一次。但这只是猜测。

但是,如果您真的想要组合模块属性,可以这样做。

@all_fields @required_fields ++ @optional_fields
def all_fields, do: @all_fields

您的问题出现是因为您无法使用模块中的函数来定义模块属性。

答案 1 :(得分:1)

@required_fields    ~w(email)
@optional_fields    ~w(password role name last_name age country)
@all_fields         @required_fields ++ @optional_fields


def required_fields, do: @required_fields
def optional_fields, do: @optional_fields
def all_fields,      do: @all_fields

我怀疑你需要模块属性和公共方法;考虑只使用一个(如果你只在模块中使用它们,模块属性应该完成工作,否则你应该使用公共方法)。