Elixir Language
定数
サーチ…
備考
これは、私がElixirモジュールでどのように定数を定義するのかに記載されている方法に基づいて行った要約分析です。 。私はいくつかの理由でそれを投稿しています:
- ほとんどのElixirのドキュメントはかなり徹底していますが、この重要なアーキテクチャー上の決定にガイダンスが欠けていることがわかりました。
- 私は少しの可視性を得て、トピックについて他の人からコメントしたかったのです。
- また、新しいSOドキュメンテーションワークフローを試してみたかったのです。 ;)
また、コード全体をGitHub repo elixir-constants-conceptにアップロードしました。
モジュールスコープ定数
defmodule MyModule do
@my_favorite_number 13
@use_snake_case "This is a string (use double-quotes)"
end
これらは、このモジュール内からのみアクセスできます。
関数としての定数
宣言:
defmodule MyApp.ViaFunctions.Constants do
def app_version, do: "0.0.1"
def app_author, do: "Felix Orr"
def app_info, do: [app_version, app_author]
def bar, do: "barrific constant in function"
end
消費する:
defmodule MyApp.ViaFunctions.ConsumeWithRequire do
require MyApp.ViaFunctions.Constants
def foo() do
IO.puts MyApp.ViaFunctions.Constants.app_version
IO.puts MyApp.ViaFunctions.Constants.app_author
IO.puts inspect MyApp.ViaFunctions.Constants.app_info
end
# This generates a compiler error, cannot invoke `bar/0` inside a guard.
# def foo(_bar) when is_bitstring(bar) do
# IO.puts "We just used bar in a guard: #{bar}"
# end
end
輸入で消費する:
defmodule MyApp.ViaFunctions.ConsumeWithImport do
import MyApp.ViaFunctions.Constants
def foo() do
IO.puts app_version
IO.puts app_author
IO.puts inspect app_info
end
end
この方法では、プロジェクト間で定数を再利用できますが、コンパイル時定数を必要とするガード関数内では使用できません。
マクロによる定数
宣言:
defmodule MyApp.ViaMacros.Constants do
@moduledoc """
Apply with `use MyApp.ViaMacros.Constants, :app` or `import MyApp.ViaMacros.Constants, :app`.
Each constant is private to avoid ambiguity when importing multiple modules
that each have their own copies of these constants.
"""
def app do
quote do
# This method allows sharing module constants which can be used in guards.
@bar "barrific module constant"
defp app_version, do: "0.0.1"
defp app_author, do: "Felix Orr"
defp app_info, do: [app_version, app_author]
end
end
defmacro __using__(which) when is_atom(which) do
apply(__MODULE__, which, [])
end
end
use
時に消費use
:
defmodule MyApp.ViaMacros.ConsumeWithUse do
use MyApp.ViaMacros.Constants, :app
def foo() do
IO.puts app_version
IO.puts app_author
IO.puts inspect app_info
end
def foo(_bar) when is_bitstring(@bar) do
IO.puts "We just used bar in a guard: #{@bar}"
end
end
このメソッドでは、 @some_constant
内側に@some_constant
を使用できます。私はその機能が厳密に必要であるかどうかも分かりません。
Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow