수색…


비고

이것은 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 과 소비 :

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 를 가드 내부에서 사용할 수 있습니다. 나는 그 기능들이 꼭 필요한 것이라고 확신하지 못한다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow