gpt4 book ai didi

types - Elixir - 为什么在 @callback 定义中需要类型规范?

转载 作者:行者123 更新时间:2023-12-03 14:57:22 38 4
gpt4 key购买 nike

似乎当您定义行为时,您必须在 @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

    最佳答案

    原因@callback@spec 相同,它需要类型。
    如果您将在第一个示例中定义返回类型,它也会失败:

    iex(1)> defmodule Greeting do
    ...(1)> @callback hello(person) :: any()
    ...(1)> end
    ** (CompileError) iex:2: type person() undefined

    关于检查类型,我想还没有完成

    关于types - Elixir - 为什么在 @callback 定义中需要类型规范?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48899272/

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