gpt4 book ai didi

elixir - 在 Elixir 的 defstruct 中使用 @type 指令。没有对字段进行运行时类型检查

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

我了解如何使用 @type 指令来定义用户定义的类型。到目前为止,我只在函数规范中遇到过它的用法。我很想知道它的用法是否可以扩展到结构,使参数与其数据类型之间存在紧密耦合。

我开始探索一个示例程序。

iex(1)> defmodule Result do
...(1)> @type t ::%__MODULE__{ status: String.t, value: integer}
...(1)> defstruct status: "OK", value: 100
...(1)> end

我的理解是 Result 是一个结构,状态字段是字符串,值字段是整数。
iex(2)> %Result{}      
%Result{status: "OK", value: 100}

然而,令我惊讶的是,当我尝试输入不同的数据类型时,编译器没有抛出任何错误并且对输入数据感到满意。
iex(3)>res = %Result{status: 555, value: "blahblah"}
%Result{status: 555, value: "blahblah"}

该文档建议为结构定义类型。但是当它打开一个错误窗口时,我没有看透这一点。
能否请您分享您对此的看法。

最佳答案

恐怕您对 typespecs 的用途感到困惑。

Elixir 是一种动态类型语言,因此编译器不会真正检查类型规范。这就是 erlang 文档对这些用法的描述:

Type information can be used for the following:

  • To document function interfaces
  • To provide more information for bug detection tools, such as Dialyzer
  • To be exploited by documentation tools, such as EDoc, for generating program documentation of various forms


所以如果你使用 Dialyzer ,它可能会提示传递规范无效结构。

关于elixir - 在 Elixir 的 defstruct 中使用 @type 指令。没有对字段进行运行时类型检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38617108/

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