如何为 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 结构验证/强制执行类型和值? 的相关文章

  • Elixir + Ecto:不在 [array] 中怎么办?

    我正在尝试寻找所有Users 中没有特定的字符串元素match history场地 我对此进行了猜测 matched user User gt where u device id not in u match history gt limi
  • 如何使用 Elixir 生成随机 url 安全字符串

    我需要能够生成随机 url 安全字符串 以便我可以在链接中使用这些字符串 例如发送到用户电子邮件的激活链接 那么如何生成它呢 有没有办法只用 Elixir 来做到这一点 或者我必须使用一些库 您可以做的是生成一个 Base64 编码的字符串
  • 了解 Elixir 函数参数中的模式匹配

    在 Elixir in Action 一书中 其中一个示例的一个函数颠覆了我对模式匹配的理解 def add entry TodoList entries entries auto id auto id todo list entry do
  • 在 Elixir 中引用管道值

    我想计算字符串中单词出现的次数 实现是有问题的 但让我们用它来演示我的问题 def count sentence do words String split sentence occurrences Enum map words fn w
  • mix 在代理后面不起作用

    我一直都在用mix至少就在两周前落后于代理 但是我昨天发现 mix 无法在代理后面工作 混合版本是1 1 1 mix local hex 运行 但混合 deps get 会出现错误 mix deps get Registry update
  • 如何让表单和交易在phoenix+ecto中发挥良好?

    我正在玩 Phoenix Ecto 我偶然发现了一些对我来说不习惯的东西 我有一个代表一个表格Invitation 创建邀请函时 我们还需要创建一个User显然我希望两者都发生在一个事务中 这样我就可以保持数据的一致性 在我的表格中我要求n
  • 在 Elixir 中测试异步代码

    我想测试一个正在使用的函数Task async 为了让我的测试通过 我需要让它在断言之前休眠 100 毫秒 否则测试进程会在执行异步任务之前被终止 有没有更好的办法 编辑 添加代码示例 我想测试的代码 大致 def search param
  • Ecto 与某种情况的关联

    假设我有两个模型 Post and Comment评论模型可以是两种类型中的一种 normal and fancy由列定义type in the comments table 现在我想在我的上添加 2 个关联Post模型 其中一个指的是花哨
  • Phoenix CSRF 令牌不匹配

    试图让 ajax 工作在 Phoenix 上 我通过执行以下操作来获取 csrf 令牌 这样我就拥有了它
  • 在 Elixir 中将映射转换为关键字列表

    我有一张以下形式的地图 browser name gt Chrome platform gt linux 我需要将其转换为关键字列表 browser name Chrome platform linux 实现这一目标的最佳方法是什么 这行不
  • 如何使用 Erlang/OTP 25 编译器重新编译 rebar3?运行灵药 1.13.4

    我正在关注免费的截屏视频 教程凤凰城 LiveView 启动器 https online pragmaticstudio com courses liveview starter modules 2但我什至无法开始 因为mix setup失
  • Elixir/erlang 在哪里适合微服务方法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 最近 我一直在使用 docker compose 进行一些实验 以便部署多个协作微服务 我可以看到微服务提供的许多好处 而且现在有一个
  • UndefinedFunctionError phoenix Elixir 新项目

    全新安装 Phoenix 后 我尝试触发一个新项目 当我尝试运行服务器时 我遇到了 Unchecked dependencies for environment dev gettext Hex package the dependency
  • 查找 Elixir/Erlang 内存文件的长度?

    在 Elixir 或 Erlang 中 如果我有一个内存文件 如何找到它的字节长度 ok fd file open ram read write file write fd hello 不确定是否有更好的方法 但这就是我所做的 def ge
  • 当作为函数参数传递时,elixir 是否会生成映射的副本?

    换句话说 我想知道在 Elixir 中 映射是通过值还是通过引用传递给函数 鉴于 Elixir 的无副作用原则 我怀疑这是有价值的 但是大地图不会造成巨大的重复效率低下吗 在此先感谢您的帮助 由于 Elixir 中的所有术语都是不可变的 因
  • “!”、“?”、“_”和“.”是什么意思? Elixir 中的语法

    我需要帮助理解 Elixir 中的以下语法 and 这些语法在 Elixir 的功能中起什么作用 例如Repo get 我不确定它们是否只是函数名称 或者有一个角色 虽然我知道 用于调用匿名函数 和 对于任何或可变的 失败时引发异常的函数约
  • Ecto 和 Elixir 的默认日期时间

    我今天刚刚开始使用 Elixir 和 Phoenix 我正在尝试添加 Ecto 作为映射器 但我在使用时间时遇到了一些问题 这是我的模型 schema users do field name string field email strin
  • Ecto - 验证关联模型的存在

    如何验证 Ecto 中是否存在关联模型 schema foo do has many bar Bar timestamps end required fields w bar invalid 有办法这样做吗 并验证这些字段的最小 最大数量
  • GenServer 正常关闭

    我使用 GenServer 编写了一个 Elixir 应用程序 该应用程序在启动时启动外部应用程序 然后将其关闭 并在退出时进行其他清理 我在中添加了启动功能init 1 https hexdocs pm elixir GenServer
  • 如何完全禁用 Elixir/Phoenix 生成器和模型中的上下文?

    凤凰城有一个发电机 mix phx gen html Accounts User users name string age integer 我不想为我的模型使用上下文 也不想提供它的名称 如何禁用它 您仍然可以使用 1 2 及更早版本中的

随机推荐