保持常量的最佳方法是什么,这些常量可以在不同的Elixir应用程序之间共享?
就我而言,我在系统中拥有用于不同类型付款的简写。 例如
CreditCard => "ccd", CashOnDelivery => "cod"
等我想在应用程序之间共享这些值。
答案 0 :(得分:4)
Erlang提供了两个神奇的功能,binary_to_term/1
和term_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?”:
答案 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