gpt4 book ai didi

elixir - 如何在匹配所有 “can never match” 的 `with` 语句中避免来自 Dialyzer 的 `else` 错误?

转载 作者:行者123 更新时间:2023-12-04 04:15:06 24 4
gpt4 key购买 nike

我有以下代码:

@spec test_pass(String.t) :: (:failed | {:ok, map()})
def test_pass(pass) do
db_user = %{password_hash: @hash_for_foo}
with {:ok, ^db_user} <- Comeonin.Argon2.check_pass(db_user, pass) do
{:ok, db_user}
else
_ -> :failed
end
end
Dyalizer 给了我“永远无法匹配的错误”:
⟨my_file⟩.ex:25: The pattern {'ok', _} can never match the type {'error',<<_:64,_:_*8>>}
我的问题是,为什么?我知道它不能匹配,我实际上不在乎,这就是我使用 with 的原因首先。所有不匹配的情况都在 else 中处理。 .
如何更改我的代码 dialyzer会满意吗?
我不是在寻找 @dialyzer {:nowarn_function, …} .我已经用 {:error, _} -> … 试过了 else 中的表达式 body 却无济于事。
Erlang/Elixir 版本 ( elixir -v ):
Erlang/OTP 20 [erts-9.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false]

Elixir 1.6.1 (compiled with OTP 19)
Argon.check_pass/2 is external, from Comeonein .
我查了 comeonin出去,跑了 mix dialixier就它,它报告了几个 no local return错误。

最佳答案

透析器对用户非常不友好。然而,如果它报告错误,则意味着根据您对函数进行注释的各种类型规范,因此它与您的实际用法存在矛盾。

当 Dialyzer 提示 {'error',<<_:64,_:_*8>>} , 表示 Argon2.check_pass有一些相互矛盾的类型规范,要么是它本身,要么是潜在的更深层次的东西。 Dialyzer 在准确指出矛盾发生的地点和原因方面并不是很友好。

由于我没有完全访问您的代码的权限,为了解决这个问题,我最多可以指出您执行以下几个步骤:

  • 如果 Argon2.check_pass有一个明确的 @spec注释,然后将其注释掉,看看 Dialyzer 是否仍然提示。
  • 如果投诉没有了,那么修改@spec的各个部分带有 any 的注释直到问题消失以进行识别。因此,问题将在那里解决,或者您需要更深入地挖掘 Argon2.check_pass 的其他功能。依赖于这可能是问题的原因。
  • 如果1.失败,则复制粘贴定义的函数Argon2.check_pass作为私有(private)函数:tmp_check_pass看看这如何改变问题。

  • 4.如果需要,您可能需要介绍更多这些 tmp_... Argon2.check_pass 的函数靠的是为了隔离投诉的根本原因。在此之前,首先尝试注释掉所有 @spec Argon2.check_pass 的任何支持函数的注释相应地利用并应用第 1 点。

    最终,您将到达代码中的特定点,根据您提供给 Dialyzer 的规范,您的代码的某些用法违反了它:类型 {'error',<<_:64,_:_*8>>}
    这里的关键思想是尝试找出投诉的根本原因,遗憾的是,Dialyzer 不时为您指出的不太准确。

    关于elixir - 如何在匹配所有 “can never match” 的 `with` 语句中避免来自 Dialyzer 的 `else` 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49660942/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com