【发布时间】:2018-07-31 15:24:55
【问题描述】:
似乎当您定义一个行为时,您必须在 @callback 定义中包含类型规范。然后,当您采用该行为时,编译器要求定义 function_name/arity,但如果您不遵循类型规范,则非常高兴。
我的问题是:
- 这些观察结果正确吗?
- 如果是,为什么
@callback将类型规范与检查function_name/arity是否已定义的实际功能结合起来?很难理解什么是文档,什么是核心功能。 Elixir 的其余部分似乎清楚地将两者分开,将类型规范作为可选添加。
例如:
如果我们省略类型规范,我们会得到一个编译错误
defmodule Greeting do
@callback hello(person)
end
# (CompileError) iex:82: type specification missing return type: hello(person)
为了让编译器满意,我们必须包含类型规范:
defmodule Greeting do
@callback hello(%Person{}) :: {:ok, String.t} | {:error, String.t}
end
现在,当我们采用该行为时,编译器会检查 function_name/arity 是否已定义:
defmodule WesternGreeting do
@behaviour Greeting
def hello(), do: "Howdy"
end
# warning: undefined behaviour function hello/1 (for behaviour Greeting)
但是,@callback 中的所有类型规范都被编译器忽略了:
defmodule WesternGreeting2 do
@behaviour Greeting
def hello([a, b, c]), do: a <> b <> c
end
# No warnings or errors
【问题讨论】:
-
规格不是由编译器检查,而是由透析器等外部工具检查
-
@Grych 帖子中的错误是
# (CompileError) iex:82: type specification missing return type: hello(person)这似乎表明编译器确实检查了它。我错过了什么吗?
标签: types module elixir behavior