2016-07-28 3 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がガードテストで利用できるため、特別な場所に値すると思われます。 (私は、ガードテストで利用可能な他のモジュールには関数があることを覚えているようですが、メモリが私を欺いているかもしれません)。

関連する問題