サーチ…


備考

これは、私が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