gpt4 book ai didi

erlang - Dialyzer 说函数永远不会被调用,即使它是

转载 作者:行者123 更新时间:2023-12-03 15:00:05 25 4
gpt4 key购买 nike

我正在使用 elixir_talk 库。连接后,我想在连接到 beanstalkd 后调用一个私有(private)函数。我刚刚添加了 typespecs 并运行了 Dialyzer(通过 dialyxir)。我得到错误:

my_module.ex:3: The specification for 'Elixir.MyModule':f/0 states that the function might also return 'ok' | {'error',_} but the inferred return is none()
my_module.ex:4: Function f/0 has no local return
my_module.ex:14: Function g/1 will never be called

我能找到的产生这个的最小例子是
defmodule MyModule do
@spec f() :: :ok | {:error, term}
def f() do
case ElixirTalk.connect('127.0.0.1', 11300) do
{:ok, conn} ->
g(conn)
{:error, err} ->
{:error, err}
end
end

@spec g(pid) :: :ok
defp g(pid) do
:ok
end
end

如果我将调用替换为 ElixirTalk.connect调用 spawn相反,Dialyzer 不再报告任何问题。
defmodule MyModule do
@spec f() :: :ok
def f() do
x = spawn fn -> :done end
g(x)
end

@spec g(pid) :: :ok
defp g(pid) do
:ok
end
end

有谁知道为什么 Dialyzer 在这里感到困惑?

最佳答案

查看源代码,类型规范说第三个参数始终是整数,即使默认值是原子无穷大。因此,以无限超时调用 ElixirTalk.connect 将违反类型规范。在 Erlang 中,您可以通过将类型指定为 timeout() 来解决此问题,它允许整数和无穷大;不确定这如何转化为 Elixir。 – legoscia 2016 年 5 月 16 日 15:56

关于erlang - Dialyzer 说函数永远不会被调用,即使它是,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37255397/

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