我认为地图的命名空间(至少在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
表现出相反的行为。我没有尝试过其他功能,但即使这些结果也令人惊讶。
我是否在这里错过了一些重要的暗流,或者这只是语言设计中粗心大意的一个例子?
答案 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_list
和map_size/1
,但缺少函数maps:size/1
。正如Dogbert在评论中指出的那样,这可能是因为map_to_list
可用于防守测试,因此值得一个特殊的地方。 (我似乎记得其他模块中的功能可用于防护测试,但我的记忆可能会欺骗我。)