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
,这意味着它将成为一个编译顺序问题。