Zoeken…


Opmerkingen

Dus dit is een beknopte analyse die ik heb gedaan op basis van de methoden die worden vermeld in Hoe definieer je constanten in Elixir-modules? . Ik post het om een paar redenen:

  • De meeste Elixir-documentatie is vrij grondig, maar ik vond dat deze belangrijke architecturale beslissing geen begeleiding bevatte - dus ik zou het als onderwerp hebben aangevraagd.
  • Ik wilde wat zichtbaarheid en opmerkingen van anderen over het onderwerp krijgen.
  • Ik wilde ook de nieuwe SO Documentation-workflow testen. ;)

Ik heb ook de volledige code geüpload naar het GitHub repo elixir-constants-concept .

Module-scoped constanten

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

Deze zijn alleen toegankelijk vanuit deze module.

Constanten als functies

Verklaren:

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

Consumeren met vereisen:

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

Consumeren met importeren:

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

Met deze methode kunnen constanten in verschillende projecten worden hergebruikt, maar deze kunnen niet worden gebruikt in bewakingsfuncties waarvoor constanten tijdens het compileren nodig zijn.

Constanten via macro's

Verklaren:

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

Consumeren met 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

Met deze methode kunt u de @some_constant in bewakers gebruiken. Ik weet niet eens zeker of de functies strikt noodzakelijk zouden zijn.



Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow