Types 在另一个装饰函数@spec中指定对Elixir函数@spec的引用

Types 在另一个装饰函数@spec中指定对Elixir函数@spec的引用,types,elixir,Types,Elixir,有没有办法在另一个函数规范中引用函数的返回类型规范 defmodule Car do @spec beep(none()) :: String.t def beep do "beep" end @spec beep_log(none()) :: String.t def beep_log do IO.puts "beep log" beep end end 可以用如下方式指定beep_log的规格: @spec beep_log(none()

有没有办法在另一个函数规范中引用函数的返回类型规范

defmodule Car do
  @spec beep(none()) :: String.t
  def beep do
    "beep"
  end

  @spec beep_log(none()) :: String.t
  def beep_log do
    IO.puts "beep log"
    beep
  end
end
可以用如下方式指定beep_log的规格:

 @spec beep_log(none()) :: beep()

如果不定义两个函数都将返回的新数据类型,则无法实现这一点。您可以在中看到此模式的示例,其中类型由
start/3
start\u link/3
定义和共享

在您的情况下,类似这样的方法会起作用:

defmodule Car do
  @type beep_return() :: String.t

  @spec beep(none()) :: beep_return()
  def beep do
    "beep"
  end

  @spec beep_log(none()) :: beep_return()
  def beep_log do
    IO.puts "beep log"
    beep
  end
end

我也错过了YARD中的类型引用,如
@return(请参见foo)
,但有一个很好的理由不支持这一点:由于
foo\u-to\u-bar
bar\u-to\u-foo
转换函数,输入和返回类型之间可能存在循环依赖关系。在Elixir中,很多时候这些函数在不同的模块中,如
Foo.to_-bar
bar.to_-Foo
,这意味着它将成为一个编译顺序问题。