我想在'where'表达式中检查参数是否为dict类型,但在erlang参考书中找不到它。
init(Module_symbol_dict) where ???(Module_symbol_dict) ->
#state{module_symbol_dict=Module_symbol_dict}.
如果我手动编写,则不能在where表达式中使用。该怎么办?
答案 0 :(得分:2)
如果你想检查某些东西是否是dict,你可以尝试键入dict元组中的第一个元素。虽然实施可能会在未来发生变化,但我怀疑第一个元素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>
答案 1 :(得分:1)
无法检查变量的类型是字典还是其他非标准类型。但是有一些技巧。我们可以找出究竟是什么字典。启动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结构的定义。