gpt4 book ai didi

erlang - 功能规范 : -spec. 高效使用

转载 作者:行者123 更新时间:2023-12-04 01:26:56 25 4
gpt4 key购买 nike

我怎么能用 -spec erlang中的单词?
请给我一个有效使用这个词的想法。是否仅代表文档目的?

我正在尝试使用 -spec 通过函数类型规范对模块中的函数应用约束,但我失败了 - 没有应用任何限制。

最佳答案

-spec属性确实被编译器和运行时系统视为文档。您不能使用它们将任何“可执行功能”添加到您的代码中,这同样适用于 -type-opaque属性。

但是它们很有用:

  • 文档 : EDoc 使用它们为您的代码生成所有不同形式的文档。 -spec属性是函数签名,取决于您投入多少精力,可以使您的代码更易于理解和维护。假设这个月你最喜欢的数据结构是 dict() .考虑以下代码:
    my_function(SomeArg, SomeOtherArg, Dict) ->
    ...
    dict:find(SomeKey, Dict)
    ...

    用作 dict 的变量已被如此命名。但是,假设您有以下代码段:
    my_other_function(NamesDict, PlacesDict) ->
    ...
    R1 = my_function(A, B, NamesDict),
    ...
    R2 = my_function(C, D, PlacesDict),
    ...

    试图跟上这一点可能很快会导致代码重复 Dict后缀。更重要的是,您甚至可能不想在 my_other_function 的上下文中记住它。这两个参数是dict() .因此,您可能想要这样做:
    -spec my_other_function(dict(), dict()) -> atom().

    my_other_function(Names, Places) ->
    ...
    R1 = my_function(A, B, Names),
    ...
    R2 = my_function(C, D, Places),
    ...

    现在很明显,这些参数应该是 dict() 函数才能工作,希望每个人都能够在不深入代码的情况下弄清楚这一点。但是假设你正在使用这个 Name dict()在其他地方,它存储了一些通过不同 API 公开的特定信息。那么它是 -type 的完美候选者。宣言:
    -type names() :: dict().

    -spec my_other_function(names(), places()) -> atom().

    my_other_function(Names, Places) ->
    ...
    R1 = my_function(A, B, Names),
    ...
    R2 = my_function(C, D, Places),
    ...

    如果其他人经常使用这个特定的数据结构,你可能也想导出它:
    -module(my_module).

    -export_type([names/0]).

    -type names() :: dict().

    其他模块现在可以引用这个特定的数据结构:
    -module(my_other_module).

    -record(my_state, {names :: my_module:names(),
    ...}).

    最后,如果您希望其他开发人员不在他们的模块中以任何方式检查此数据结构,您可以将其声明为 -opaque .同样,这是一个“友好的建议”,到目前为止所有其他内容也是如此。还是……?
  • 差异检测 : 如果你花时间使用-specs-types您非常希望这些内容保持最新。众所周知,如果没有人关注,就没有人维护文档是最新的!幸运的是,透析器 正在看。透析器 可以 check在所有对 my_function() 的调用中参数是 dict() (即使没有您的 -spec 注释,它也可以做到这一点,但如果那里也有这些注释,那就更容易了)如果你用别的东西来称呼它,就会尖叫血腥谋杀。它还可以跟踪这些导出的类型,甚至报告不透明度违规。因此,它不仅仅是“文档”。
  • 测试用例生成 : 正确 可以使用-spec-type定义以使用随机测试用例自动检查您的函数。即使是这样的声明,它也能够制作随机测试用例:
    -type int_tree() :: {node, integer(), tree(), tree()} | nil.
  • 指定一组的全新方式回调 行为是使用熟悉的 -spec句法。编译器、透析器和可能的其他工具可以使用此信息来检查行为实现。在 OTP 行为 code 中查看更多信息和 here

  • 阅读更多 here .

    关于erlang - 功能规范 : -spec. 高效使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9378765/

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