Buscar..


Observaciones

Así que este es un análisis de resumen que he hecho en base a los métodos listados en ¿Cómo se definen las constantes en los módulos de Elixir? . Lo estoy publicando por un par de razones:

  • La mayoría de la documentación de Elixir es bastante completa, pero encontré que esta decisión arquitectónica clave carece de orientación, por lo que la habría solicitado como tema.
  • Quería obtener un poco de visibilidad y comentarios de otros sobre el tema.
  • También quería probar el nuevo flujo de trabajo de Documentación SO. ;)

También he cargado el código completo en el concepto de elixir-constantes de GitHub.

Constantes de ámbito de módulo

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

Estos solo son accesibles desde este módulo.

Constantes como funciones

Declarar:

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

Consumir con requerir:

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

Consumir con importación:

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

Este método permite reutilizar las constantes en los proyectos, pero no se podrán utilizar dentro de las funciones de guarda que requieren constantes de tiempo de compilación.

Constantes a través de macros

Declarar:

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

Consumir con 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

Este método le permite usar @some_constant dentro de guardias. Ni siquiera estoy seguro de que las funciones sean estrictamente necesarias.



Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow