跨越Elixir应用程序的共享常量

时间:2018-08-02 11:07:26

标签: elixir

保持常量的最佳方法是什么,这些常量可以在不同的Elixir应用程序之间共享?

就我而言,我在系统中拥有用于不同类型付款的简写。 例如

CreditCard => "ccd", CashOnDelivery => "cod"

等我想在应用程序之间共享这些值。

2 个答案:

答案 0 :(得分:4)

Erlang提供了两个神奇的功能,binary_to_term/1term_to_binary/1

构建您自己的地图(不要对键使用大写符号,尽管它们确实是原子,但它们保留用于模块名称。它们绝不是常数。)

shared_constants = %{credit_card: "ccd", cash_on_delivery: "cod"}

并将其存储到顶级目录中的某个文件中:

File.write!("path/to/file", :erlang.term_to_binary(shared_constants))

完成后,可从任何地方访问此地图:

shared_constants =
  "path/to/file"
  |> File.read!()
  |> :erlang.binary_to_term()

,访问值为:

shared_constants.credit_card
#⇒ "ccd"

旁注: FWIW,乔·阿姆斯特朗(Joe Armstrong)回答了问题“ What do you like the most about Erlang/OTP?”:

enter image description here

答案 1 :(得分:1)

怎么样:

defmodule Constants do
  def credit_card, do: "ccd"
  def cash_on_delivery, do: "cod"
end

应用程序目录:

~/elixir_programs$ tree app1

app1
├── README.md
├── _build
│   └── dev
│       └── lib
│           └── app1
│               ├── consolidated
│               │   ├── Elixir.Collectable.beam
│               │   ├── Elixir.Enumerable.beam
│               │   ├── Elixir.IEx.Info.beam
│               │   ├── Elixir.Inspect.beam
│               │   ├── Elixir.List.Chars.beam
│               │   └── Elixir.String.Chars.beam
│               └── ebin
│                   ├── Elixir.App1.beam
│                   ├── Elixir.Constants.beam
│                   └── app1.app
├── config
│   └── config.exs
├── lib
│   ├── app1.ex
│   └── constants.ex
├── mix.exs
└── test
    ├── app1_test.exs
    └── test_helper.exs

9 directories, 16 files

app1.ex:

defmodule App1 do
  @moduledoc """
  Documentation for App1.
  """

  @doc """
  Hello world.

  ## Examples

      iex> App1.hello
      :world

  """
  def hello do
    IO.puts "Hello #{Constants.credit_card}"
  end
end

并且:

~/elixir_programs/app1$ mix compile
Compiling 2 files (.ex)
Generated app1 app

~/elixir_programs/app1$ iex -S mix
Erlang/OTP 20 [erts-9.3] [source] [64-bit] [smp:4:4] [ds:4:4:10] [async-threads:10] [hipe] [kernel-poll:false]

Interactive Elixir (1.6.6) - press Ctrl+C to exit (type h() ENTER for help)

iex(1)> App1.hello
Hello ccd
:ok

iex(2)> 

如果您不想一直都写“ Constants”前缀,则可以导入Constants模块:

defmodule App1 do
  @moduledoc """
  Documentation for App1.
  """

  @doc """
  Hello world.

  ## Examples

      iex> App1.hello
      :world

  """
  import Constants
  def hello do
    IO.puts "Hello #{credit_card()}"  #...but need the trailing parentheses
  end
end