cnDenis http://cndenis.github.io 2013-04-27 (update:2013-09-13)

值得吐槽的是居然连求长度这么基础的方法,Erlang都没有统一起来。 分为len和size两大对立阵营:

len阵营

  • 列表(字符串是列表的一种)的长度用length/1string:len/1。 别看后面那个打着string开头,对于不是字符串的列表也照用不误, 从源代码看其实就是前一个的马甲。
  • queue模块是len阵营的,使用queue:len/1

size阵营

  • 二进制串的长度用size/1,或是用byte_size/1bit_size/1也行,分别是 比特长度和位长度,1byte = 8bit。
  • 元组的长度也用size/1,等于其元素的个数。元组的比特长度和位长度不可用。
  • dictsetsorddictordsetsarray, gb_trees, gb_sets 这几个模块也是size阵营的,使用其各自模块 下的size函数。
  • iolist 有BIF iolist_size/1可用.
  • ets比较特别,使用ets:info(Tab, size)来获取长度,Tab是表的id,或是已注册的表的名字。

另外,特立独行的“原子”没有长度。


更新(2013年9月13日)

其实Erlang对这两个方法的区分也是道理的, len是O(n)时是复杂度的函数 (是不是觉得这是另一种蛋疼), 而size是O(1)的. 换句话说就是数据长度越大, 取len的时间越长, 但取size用的时间却不受长度影响.



blog comments powered by Disqus
头像

cnDenis

Email: 联系我

Fork me on GitHub