Recherche…


Remarques

Voici donc une analyse récapitulative que j'ai effectuée sur la base des méthodes répertoriées dans Comment définir des constantes dans les modules Elixir? . Je le poste pour deux raisons:

  • La plupart des documents d'Elixir sont assez complets, mais j'ai trouvé cette décision architecturale clé manquant de conseils - alors je l'aurais demandé comme sujet.
  • Je voulais avoir un peu de visibilité et des commentaires des autres sur le sujet.
  • Je voulais également tester le nouveau flux de production de la documentation SO. ;)

J'ai également téléchargé l'intégralité du code sur le concept GitHub repo elixir-constants .

Constantes de portée de module

defmodule MyModule do
  @my_favorite_number 13
  @use_snake_case "This is a string (use double-quotes)"
end

Celles-ci ne sont accessibles que depuis ce module.

Constantes comme fonctions

Déclarer:

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

Consommer avec exigent:

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

À consommer avec importation:

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

Cette méthode permet de réutiliser les constantes sur les projets, mais elles ne seront pas utilisables dans les fonctions de garde qui nécessitent des constantes de compilation.

Constantes via des macros

Déclarer:

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

À consommer avec 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

Cette méthode vous permet d'utiliser @some_constant intérieur des gardes. Je ne suis même pas sûr que les fonctions seraient strictement nécessaires.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow