Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/elixir/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Elixir 长生不老药_Elixir - Fatal编程技术网

Elixir 长生不老药

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)

我想在Elixir中创建一个枚举。可能吗?我所说的枚举是指来自C/C++或Ruby或许多其他语言的枚举。我知道Enum模块,但那只是一个模块——基本上是函数的容器。

你可以使用原子。对于静态分析,可以定义只接受特定值的类型,并在TypeSpec中使用该类型。然后,您可以使用示例检查代码

@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