Types 检查变量在Erlang中是否为自定义类型?

Types 检查变量在Erlang中是否为自定义类型?,types,erlang,typechecking,custom-type,Types,Erlang,Typechecking,Custom Type,有没有办法检查Erlang中的变量是否为自定义类型 假设我在.hrl文件中定义了一些记录和类型: -record(custom_record, { attr1 :: list(), attr2 :: binary(), attr3 :: tuple() }). -record(another_record, { attr1 :: list(), attr2 :: binary(), }). -type custom_record() :: #custo

有没有办法检查Erlang中的变量是否为自定义类型

假设我在
.hrl
文件中定义了一些记录和类型:

-record(custom_record, {
    attr1 :: list(),
    attr2 :: binary(),
    attr3 :: tuple()
}).

-record(another_record, {
    attr1 :: list(),
    attr2 :: binary(),
}).

-type custom_record() :: #custom_record{}.

-type another_record() :: #another_record{}.

-type custom_records() :: custom_record() | another_record().
有没有一种简单的方法可以检查我的Erlang代码中的记录是否是
自定义\u记录
?像这样的东西会很好:

is_custom_type(CustomRecord, custom_records). %=> true

我查看了文档,没有看到任何内置函数可以执行此操作。

为此,您可以使用模式匹配:

is_custom_type(#custom_record{} = _Record) -> true;
is_custom_type(_) -> false.

Erlang中没有自定义类型。记录只是用原子标记的元组的语法糖,长度相同。类型规格仅由透析器使用,其他什么都不用。

Erlang标准库包含
is_record()
BIF,用于检查元组的第一个元素是否是适当的原子,请参见,以便您可以像
is_record(Var,custom_record)那样测试变量

这样做的缺点是,属于该类型的每个记录都需要一个函数子句。在我的示例中,只有两条记录,但在我的部分代码中有相当多的记录。那么您请求的函数将如何帮助您呢?更好的是
is_record/3
,至少如果您知道您正在使用的所有记录的大小,因为它不需要知道记录定义。