2017-04-07 11 views
0

だから私はエリクシールでモジュールの属性を定義するときの構文はしかし、私の場合のは、次のように私のモジュールが定義されているとしましょう@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

@valuesは、Module Attributesです。デフォルトではモジュールに格納されず、値はコンパイル時にのみ存在します。エリクシール'Getting Started' Guideから:モジュールはエリクサーの属性

三つの目的に役立つ:

  1. を彼らは、ユーザーまたはVMが使用することが多いの情報と、モジュールに注釈を付けるのに役立ちます。
  2. これらは定数として機能します。
  3. コンパイル時に使用される一時的なモジュールストレージとして機能します。

あなたのコードの問題は、@myvariableMyModuleのコンパイル時に設定されているが、モジュールがまだコンパイルされていないので、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 

あなたはsimilarly define your Map as a Module attributeことができますが、あなたがすることはできませんので、コンパイルした後、それが一定になるだろうそれを修正する(私はあなたが望むものだと思う)。

+0

ありがとう@Sheharyar。それは今働きます! –

関連する問題