如何检查参数的字典类型?

时间:2013-04-29 01:10:59

标签: erlang

我想在'where'表达式中检查参数是否为dict类型,但在erlang参考书中找不到它。

init(Module_symbol_dict) where ???(Module_symbol_dict) ->
    #state{module_symbol_dict=Module_symbol_dict}.

如果我手动编写,则不能在where表达式中使用。该怎么办?

2 个答案:

答案 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结构的定义。