Elixir应用程序中的共享常量
保持不同elixir应用程序之间可以共享的常量的最佳方法是什么 就我而言,我有系统中不同类型付款的速记。 e、 gElixir应用程序中的共享常量,elixir,Elixir,保持不同elixir应用程序之间可以共享的常量的最佳方法是什么 就我而言,我有系统中不同类型付款的速记。 e、 g 等等。我想让这些值在应用程序之间共享。Erlang提供了两个神奇的功能,和 构建您自己的映射(不要对键使用大写符号,虽然它们确实是原子,但它们是为模块名称保留的。它们无论如何都不是常量。) 并将其存储到顶级目录中的某个文件中: File.write!("path/to/file", :erlang.term_to_binary(shared_constants)) ~/elixi
等等。我想让这些值在应用程序之间共享。Erlang提供了两个神奇的功能,和 构建您自己的映射(不要对键使用大写符号,虽然它们确实是原子,但它们是为模块名称保留的。它们无论如何都不是常量。) 并将其存储到顶级目录中的某个文件中:
File.write!("path/to/file", :erlang.term_to_binary(shared_constants))
~/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
完成后,可以从任何位置访问此地图:
shared_constants =
"path/to/file"
|> File.read!()
|> :erlang.binary_to_term()
和访问值,如下所示:
shared_constants.credit_card
#⇒ "ccd"
旁注:FWIW,乔·阿姆斯特朗回答问题“”:
Erlang提供了两个神奇的功能,和 构建您自己的映射(不要对键使用大写符号,虽然它们确实是原子,但它们是为模块名称保留的。它们无论如何都不是常量。) 并将其存储到顶级目录中的某个文件中:
File.write!("path/to/file", :erlang.term_to_binary(shared_constants))
~/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
完成后,可以从任何位置访问此地图:
shared_constants =
"path/to/file"
|> File.read!()
|> :erlang.binary_to_term()
和访问值,如下所示:
shared_constants.credit_card
#⇒ "ccd"
旁注:FWIW,乔·阿姆斯特朗回答问题“”: 那么:
defmodule Constants do
def credit_card, do: "ccd"
def cash_on_delivery, do: "cod"
end
应用程序目录:
File.write!("path/to/file", :erlang.term_to_binary(shared_constants))
~/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
附录1.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
以及:
如果您不想一直写入前缀“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
那么:
defmodule Constants do
def credit_card, do: "ccd"
def cash_on_delivery, do: "cod"
end
应用程序目录:
File.write!("path/to/file", :erlang.term_to_binary(shared_constants))
~/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
附录1.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
以及:
如果您不想一直写入前缀“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
您还可以使用[Poison][1]库将地图存储在json文件中,使用
Poison.encode代码>和毒药。解码代码>。如果你对这个变体有什么意见,我很有兴趣读一下。[1] :@NathanRipertbinary to_term/1
速度极快,不需要任何第三方库。我完全没有理由在这里使用JSON。顺便说一句,现在最好的JSON解析器是由Elixir核心团队成员之一MichałMuskała编写的。此外,JSON不支持元组序列化,而binary_to_term/1
支持元组序列化。您还可以使用[Poison][1]库将地图存储在JSON文件中,使用Poison.encode代码>和毒药。解码代码>。如果你对这个变体有什么意见,我很有兴趣读一下。[1] :@NathanRipertbinary to_term/1
速度极快,不需要任何第三方库。我完全没有理由在这里使用JSON。顺便说一句,现在最好的JSON解析器是由Elixir核心团队成员之一MichałMuskała编写的。此外,JSON不支持元组序列化,而binary\u to\u term/1
支持元组序列化。是的,还可以创建一个由存储这些常量的GenServer
支持的应用程序。如果您想要创建一个模块,模块应该使用宏声明\u,基本上将常量作为模块属性@credit\u card
和@cash\u on\u delivery
公开,这些常量可以通过使用MyConstants
获得,而不会用冗余函数污染名称空间。是的,还可以创建一个由存储这些常量的GenServer
支持的应用程序。如果您想要创建一个模块,该模块应该使用宏声明\u,基本上将常量作为模块属性@credit\u card
和@cash\u on\u delivery
公开,这些常量可以通过使用MyConstants
获得,而不会用冗余函数污染名称空间。