struct - 强制执行结构中的所有键

标签 struct elixir

如何在不需要复制所有键的情况下强制执行结构中的所有键?为了澄清,我想干这个:

defmodule Ticket do
  @enforce_keys [:origin, :destination, :price]
  defstruct [:origin, :destination, :price]
end

我可以使用其他变量:
defmodule Ticket do
  struct_keys = [:origin, :destination, :price]
  @enforce_keys struct_keys
  defstruct struct_keys
end

它工作正常,但看起来很吵。有没有更好的方法?

最佳答案

您可以通过@enforce_keysdefstruct自从 @enforce_keys只是一个普通的模块属性:

defmodule Ticket do
  @enforce_keys [:origin, :destination, :price]
  defstruct @enforce_keys
end
iex(1)> defmodule Ticket do
...(1)>   @enforce_keys [:origin, :destination, :price]
...(1)>   defstruct @enforce_keys
...(1)> end
iex(2)> %Ticket{}
** (ArgumentError) the following keys must also be given when building struct Ticket: [:origin, :destination, :price]
    expanding struct: Ticket.__struct__/1
    iex:2: (file)

关于struct - 强制执行结构中的所有键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41609368/

相关文章:

c - 如何在c中正确释放()我的malloc

c++ - 为什么我们需要 C++ 中的 `class`,而 `struct` 可用于实现相同的目的?

c++ - 结构中的函数不做任何事情

elixir - 是否可以启动交互式 elixir shell 并立即调用函数?

elixir - 如何从 List 中创建多个 GenServer 进程并映射存储在其中的数据?

elixir - 将 Phoenix 请求路径与数据库中定义的 Route 匹配

docker - 如何在Docker中使用Erlang来运行Phoenix应用程序?

C-迭代通过 void* 传递的结构数组

c# - 如果数组用作 struct (C#) 中的元素,它存储在哪里?

concurrency - Elixir/Erlang 和 Cowboy - 如何使用主管