首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Dialyzer说函数永远不会被调用,即使它是

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

Stack Overflow用户
提问于 2016-05-16 21:41:59
回答 1查看 1.2K关注 0票数 7

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

代码语言:javascript
运行
复制
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

我能找到的最小示例是

代码语言:javascript
运行
复制
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不再报告任何问题。

代码语言:javascript
运行
复制
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

有人知道为什么透析器会在这里变得混乱吗?

EN

回答 1

Stack Overflow用户

发布于 2021-04-23 04:13:45

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37255397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档