Suche…


Bemerkungen

Dies ist also eine zusammenfassende Analyse, die ich anhand der unter Wie definiere ich Konstanten in Elixir-Modulen aufgelisteten Methoden durchgeführt habe . . Ich poste es aus mehreren Gründen:

  • Die meisten Elixir-Dokumentationen sind ziemlich gründlich, aber ich fand diese wichtige architektonische Entscheidung ohne Anleitung - daher hätte ich sie als Thema gefordert.
  • Ich wollte ein wenig Sichtbarkeit und Kommentare von anderen zum Thema bekommen.
  • Ich wollte auch den neuen Workflow für die SO-Dokumentation testen. ;)

Ich habe auch den gesamten Code in das GitHub-Repo- Elixier-Konstanten-Konzept hochgeladen.

Konstanten für Module

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

Diese sind nur innerhalb dieses Moduls zugänglich.

Konstanten als Funktionen

Erklären:

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

Mit konsumieren benötigen:

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

Bei Import einnehmen:

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

Mit dieser Methode können Konstanten projektübergreifend wiederverwendet werden. Sie können jedoch nicht in Guard-Funktionen verwendet werden, für die Konstanten zur Kompilierungszeit erforderlich sind.

Konstanten über Makros

Erklären:

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

Mit use verbrauchen:

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

Mit dieser Methode können Sie die @some_constant innerhalb der Guards verwenden. Ich bin mir nicht mal sicher, ob die Funktionen unbedingt notwendig sind.



Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow