我想在“where”表达式中检查参数是否为dict类型,但在erlang参考书中找不到。
init(Module_symbol_dict) where ???(Module_symbol_dict) ->
#state{module_symbol_dict=Module_symbol_dict}.如果我手动编写它,它不能在where表达式中使用。该怎么做呢?
发布于 2013-04-29 12:37:18
没有办法检查变量的类型是字典还是其他非标准类型。然而,也有一些技巧。我们可以找出字典到底是什么。启动Erlang shell并键入:
> dict:new().
{dict,0,16,16,8,80,48,
{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
{{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}所以我们看到- dict本身是一个具有特定结构的元组-它由9个元素组成,它的第一个元素是一个原子'dict‘。所以在你的例子中,我们可以检查变量是否为dict:
init({dict, _, _, _, _, _, _, _, _} = Module_symbol_dict) ->
#state{module_symbol_dict=Module_symbol_dict}.您可以添加对dict元组的其他元素的检查来改进它。
但是请注意,恐怕这不是一个很好的方法,因为dict是dict模块的内部类型,程序员应该将其用作黑盒。它们可能会在未来的Erlang版本中改变dict结构的定义。
发布于 2013-04-29 16:36:50
如果你想检查某个东西是否是dict,你可以尝试关闭dict tuple中的第一个元素。虽然实现在未来可能会改变,但我怀疑第一个元素是dict是否会改变。试试我在这个函数中使用的卫士:
checkdict.erl
-module(checkdict).
-export([checkdict/1]).
checkdict(DictCand) when is_tuple(DictCand) andalso element(1, DictCand) =:= dict ->
is_dict;
checkdict(_NotDict) ->
not_dict.测试:
Erlang R15B03 (erts-5.9.3.1) [source] [64-bit] [smp:8:8] [async-threads:0] [hipe] [kernel-poll:false] [dtrace]
Eshell V5.9.3.1 (abort with ^G)
1> c(checkdict).
{ok,checkdict}
2> checkdict:checkdict(a).
not_dict
3> checkdict:checkdict(dict:new()).
is_dict
4> checkdict:checkdict({some, other, tuple}).
not_dict
5> https://stackoverflow.com/questions/16269893
复制相似问题