2016-07-28 97 views
0

我认为地图的命名空间(至少在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表现出相反的行为。我还没有尝试其他功能,但即使这些结果也令人惊讶。

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

+2

有'maps:size'因为调用函数没有意义' map_'在'maps'模块中。我相信'map_size'也在默认名称空间中,因为它在守卫中是允许的,但我不是100%确定的。 – Dogbert

+0

@Dogbert很好的解释! 'maps:size'对我来说是新的,现在整个事情变得更有意义了。 – dotslash

回答

3

我看到这个逻辑。 map_size/1函数也可用作maps:size/1,其中两个名称都包含您需要的信息:它需要一张地图并返回大小。另一方面,名称to_list没有说明你要转换的内容。有几个to_list功能在默认名称空间已经:

  • atom_to_list
  • binary_to_list
  • float_to_list
  • integer_to_list
  • pid_to_list
  • tuple_to_list

所以这里的不一致是,虽然“大小”可用map_size/1maps:size/1,功能map_to_list丢失。正如Dogbert在评论中指出的那样,这可能是因为map_size可用于后卫测试,因此值得一个特殊的地方。 (我似乎记得在其他模块中有可用于防护测试的功能,但是我的内存可能会欺骗我)。

相关问题