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