地图的命名空间不一致?

时间:2016-07-28 15:33:03

标签: erlang

我认为地图的命名空间(至少在R19中)非常奇怪。考虑一下这个例子:

14> M = #{a => 2, b => 3, c => 4}.
#{a => 2,b => 3,c => 4}
15> M.
#{a => 2,b => 3,c => 4}
16> map_size(M).                                    
3
17> maps:map_size(M).
** exception error: undefined function maps:map_size/1
18> to_list(M).      
** exception error: undefined shell command to_list/1
19> maps:to_list(M).
[{a,2},{b,3},{c,4}]

因此,map_size在默认命名空间中可用,但在maps:中不可用。但是,to_list/1表现出相反的行为。我没有尝试过其他功能,但即使这些结果也令人惊讶。

我是否在这里错过了一些重要的暗流,或者这只是语言设计中粗心大意的一个例子?

1 个答案:

答案 0 :(得分:2)

我看到了一些逻辑。 Console.WriteLine(z.ToString("N1"));函数也可用作maps:size/1,其中两个名称都包含您需要的信息:它采用地图,并返回大小。另一方面,名称map_size/1并未说出您要转换的内容。默认名称空间中已有多个to_list函数:

  • to_list
  • atom_to_list
  • binary_to_list
  • float_to_list
  • integer_to_list
  • pid_to_list

因此,此处的不一致是,虽然“大小”可用作tuple_to_listmap_size/1,但缺少函数maps:size/1。正如Dogbert在评论中指出的那样,这可能是因为map_to_list可用于防守测试,因此值得一个特殊的地方。 (我似乎记得其他模块中的功能可用于防护测试,但我的记忆可能会欺骗我。)