Elixir 长生不老药
我想在Elixir中创建一个枚举。可能吗?我所说的枚举是指来自C/C++或Ruby或许多其他语言的枚举。我知道Enum模块,但那只是一个模块——基本上是函数的容器。你可以使用原子。对于静态分析,可以定义只接受特定值的类型,并在TypeSpec中使用该类型。然后,您可以使用示例检查代码Elixir 长生不老药,elixir,Elixir,我想在Elixir中创建一个枚举。可能吗?我所说的枚举是指来自C/C++或Ruby或许多其他语言的枚举。我知道Enum模块,但那只是一个模块——基本上是函数的容器。你可以使用原子。对于静态分析,可以定义只接受特定值的类型,并在TypeSpec中使用该类型。然后,您可以使用示例检查代码 @type state :: :a | :b | :c @spec set_state(pid, state) :: :ok | {:error, term} def set_state(pid, state)
@type state :: :a | :b | :c
@spec set_state(pid, state) :: :ok | {:error, term}
def set_state(pid, state)
# ...
end
@spec get_state(pid) :: state
def get_state(pid)
# ...
end
如果我理解正确,您正在寻找一种在Elixir中使用枚举的方法。可以通过使用:原子作为关键帧的贴图实例执行此操作
weekdays = [:monday, :tuesday, :wednesday, :thursday, :friday, :saturday, :sunday]
|> Enum.with_index
|> Map.new
或者更手动一点
weekdays = %{
monday: 0,
tuesday: 1,
wednesday: 2,
thursday: 3,
friday: 4,
saturday: 5,
sunday: 6}
如果使用:atoms作为键,则简写访问语法为:
iex> weekdays.monday
0
iex> weekdays.friday
4
但通常使用:error或:ok这样的原子并不要求您进行这些声明 我认为简短的答案是否定的。如果使用enum,您指的是静态用户定义的 在编译时强制执行类型(即c枚举),那么答案肯定是否定的 答案很长,Elixir/Erlang的底层VM中只有固定数量的基本数据类型。有以下基本数据类型:
[Atom, Integer, Float, BitString, Regexp, PID, Function, Reference, Port]
和3种容器类型
[Tuple, List, Map]
您可以组合这些类型以创建非常复杂的数据结构,但是如果您想将“规则”应用于这些组合类型的行为,则需要创建一个函数库或模块,以便根据规则操作这些类型
因为Elixir是一种动态语言,所以它总是可以“达到”任何复杂的数据类型并完全转换它。除非通过一组已定义的函数来执行,否则无法对值强制执行规则。我猜您要查找的是
FixedSet
类型,它只能从预定义的值列表中获取值。这将相对简单地实现为一个模块,但编写一个函数模块(可能还有一些宏)是用Elixir实现这种功能的唯一方法 您可以使用以下库作为示例:。它允许您像这样定义枚举:
enum <name> do
<key_1> <value_1>
<key_2> <value_2>
[...]
end
用法:
require Settings
import Settings
value = "AR"
case value do
country_code(:argentina) ->
{:ok, "Argentina"}
country_code(:italy) ->
{:ok, "Italy"}
code when code == country_code(:usa) ->
{:ok, "United States"}
_ ->
{:error, {:must_be_one_of, country_codes()}}
end
您可能需要的是一个和。Elixir-like Erlang是一种具有不可变数据类型的函数式编程语言,因此您可以从列表开始,应用转换(通过Enum或Stream模块),然后根据自己的决定使用输出。在Ruby中,Enum是什么意思?在Ruby中有枚举和枚举器,它们与C或C++中的<代码> EnUM <代码>完全不同。这是一个库,我不想使用库。它只是一个开发工具,但是在运行时不需要它,它不会在编译代码中留下痕迹。
require Settings
import Settings
value = "AR"
case value do
country_code(:argentina) ->
{:ok, "Argentina"}
country_code(:italy) ->
{:ok, "Italy"}
code when code == country_code(:usa) ->
{:ok, "United States"}
_ ->
{:error, {:must_be_one_of, country_codes()}}
end