首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检查参数的字典类型?

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

Stack Overflow用户
提问于 2013-04-29 09:10:59
回答 2查看 589关注 0票数 0

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

代码语言:javascript
复制
init(Module_symbol_dict) where ???(Module_symbol_dict) ->
    #state{module_symbol_dict=Module_symbol_dict}.

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-04-29 12:37:18

没有办法检查变量的类型是字典还是其他非标准类型。然而,也有一些技巧。我们可以找出字典到底是什么。启动Erlang shell并键入:

代码语言:javascript
复制
> dict:new().
{dict,0,16,16,8,80,48,
      {[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]},
      {{[],[],[],[],[],[],[],[],[],[],[],[],[],[],[],[]}}}

所以我们看到- dict本身是一个具有特定结构的元组-它由9个元素组成,它的第一个元素是一个原子'dict‘。所以在你的例子中,我们可以检查变量是否为dict:

代码语言:javascript
复制
init({dict, _, _, _, _, _, _, _, _} = Module_symbol_dict) ->
    #state{module_symbol_dict=Module_symbol_dict}.

您可以添加对dict元组的其他元素的检查来改进它。

但是请注意,恐怕这不是一个很好的方法,因为dict是dict模块的内部类型,程序员应该将其用作黑盒。它们可能会在未来的Erlang版本中改变dict结构的定义。

票数 1
EN

Stack Overflow用户

发布于 2013-04-29 16:36:50

如果你想检查某个东西是否是dict,你可以尝试关闭dict tuple中的第一个元素。虽然实现在未来可能会改变,但我怀疑第一个元素是dict是否会改变。试试我在这个函数中使用的卫士:

checkdict.erl

代码语言:javascript
复制
-module(checkdict).

-export([checkdict/1]).

checkdict(DictCand) when is_tuple(DictCand) andalso element(1, DictCand) =:= dict ->
  is_dict;
checkdict(_NotDict) ->
  not_dict.

测试:

代码语言:javascript
复制
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> 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16269893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档