Types 检查变量在Erlang中是否为自定义类型?
有没有办法检查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
.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
,至少如果您知道您正在使用的所有记录的大小,因为它不需要知道记录定义。