2016-02-17 4 views
6

エリクシール語でランダムアクセスの「const配列」を作成する標準的な方法は何ですか? elem/2/element/2を介してアクセスがOであると思われるようエリクサーで "const array"に相当する方法は何ですか?

アーラン背景から(例えばCRCの計算に使用されるもの、又はAES Sボックスの場合)I(1)、「アレイ」自体はタプルなければならないこと、想定します(機能BIF_RETTYPE element_2(BIF_ALIST_2)erts/emulator/beam/bif.c)。

しかし、Erlang/Elixirにはグローバルがないため、ストレージのスコープはどうですか?私の鼻には@module_attributeがありますが、@attributesがどこにいつ展開されるのかはよく分かりません。

既知のErlangの問題があります。モジュールに-define(LARGE_LIST,[...])があり、関数に?LARGE_LISTを使用しています。値は各関数呼び出しで再構築されます。解決策は、アプリケーション開始時に一度構築し、それをパラメータの1つとして必要とする関数に渡すことでした。

エリクサーの@module_attributeはこの問題を解決しているのですか、それとも気まぐれなマクロ展開として扱われていますか?私はmodule attributesの公式ドキュメントを読んだが、私はまだ混乱している。

答えて

7

エリクシルモジュールの属性は、Erlangモジュールの属性と同じように機能します。すなわち、Module:module_info(Attributes)で取得できるモジュールのメタデータです。これは最終的に、のbeam_load.cに入ります。これは、アクセスされるたびにデータをコピーすることができます。したがって、モジュール属性は、頻繁にアクセスされる大量のデータには適していません。

代わりに、引数をとらず、タプルを返す関数を記述します。タプルはモジュールの定数プールにコンパイルされるので、関数が呼び出されるたびに再構築されることはありません。関数は本質的に定数データへの参照を返します。これについては、「定数プール」セクションのthe Erlang Efficiency Guideに記載されています。

関連する問題