有没有办法在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代码中的记录是否为custom_record
?这样的事情会很好:
is_custom_type(CustomRecord, custom_records). %=> true
我查看了文档,但没有看到任何内置函数执行此操作。
答案 0 :(得分:7)
Erlang标准库包含is_record()
BIF,用于检查元组的第一个元素是否为适当的原子,请参阅is_record/2,以便您可以像is_record(Var, custom_record)
一样测试变量。< / p>
答案 1 :(得分:2)
Erlang中没有自定义类型。记录只是用元素标记并具有相同长度的元组的语法糖。 Typespecs仅由透析器使用,没有别的。
答案 2 :(得分:1)
您可以为此目的使用模式匹配:
is_custom_type(#custom_record{} = _Record) -> true;
is_custom_type(_) -> false.