如何为 Elixir 结构验证/强制执行类型和值?

2024-01-10

如何为 Elixir Structs 验证/强制执行值的类型和范围?

例如在结构创建期间,如果提交无效类型/值,则抛出错误

  • lat 应该是数字并且在 -90.0 和 +90.0 之间
  • lon 应该是数字并且在 -180.0 和 +180.0 之间
defmodule Location do
  @enforce_keys [:lat, :lon]
  defstruct lat: 0, lon: 0
end

这里有一些讨论@何塞瓦利姆 https://stackoverflow.com/users/588267/jos%C3%A9-valim,但不清楚结果是什么https://groups.google.com/forum/#!topic/elixir-lang-core/U_wdxEqWj_Y https://groups.google.com/forum/#!topic/elixir-lang-core/U_wdxEqWj_Y


无论您正在寻找终身保护/类型保证,是不可能的。结构是下面是裸露的地图 https://elixir-lang.org/getting-started/structs.html#structs-are-bare-maps-underneath:

defmodule Location do
  @enforce_keys [:lat, :lon]
  defstruct lat: 0, lon: 0
end

loc = %Location{lat: 0, lon: 0}
is_map(loc) #⇒ true

更重要的是,人们可以简单地创建一个map with __struct__键设置为原子,表示结构名称,瞧:

loc_str = %{__struct__: Location, lat: 0, lon: 0}
#⇒ %Location{lat: 0, lon: 0}

or use Kernel.struct/2 https://hexdocs.pm/elixir/Kernel.html#struct/2, that 不检查任何东西 https://github.com/elixir-lang/elixir/blob/1451797b919c03557f8c9c0468edd5a40c852600/lib/elixir/lib/kernel.ex#L1976:

struct(Location, [lat: 0, lon: 0])
#⇒ %Location{lat: 0, lon: 0}

也就是说,人们不应该对待struct作为 Elixir 类型层次结构中的一等公民。这是一张带有附加字段的地图__struct__ set.

在 Elixir 中我们常用类型规格 https://elixir-lang.org/getting-started/typespecs-and-behaviours.html and dialyzer http://erlang.org/doc/man/dialyzer.html为此目的进行静态代码分析。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何为 Elixir 结构验证/强制执行类型和值? 的相关文章

随机推荐