<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>BIF on cnDenis的笔记</title><link>https://blog.cndenis.com/tags/BIF.html</link><description>Recent content in BIF on cnDenis的笔记</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Fri, 13 Sep 2013 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.cndenis.com/tags/BIF/index.xml" rel="self" type="application/rss+xml"/><item><title>Erlang中的长度</title><link>https://blog.cndenis.com/Erlang/2013/04/Erlang%E4%B8%AD%E7%9A%84%E9%95%BF%E5%BA%A6.html</link><pubDate>Sat, 27 Apr 2013 00:00:00 +0000</pubDate><guid>https://blog.cndenis.com/Erlang/2013/04/Erlang%E4%B8%AD%E7%9A%84%E9%95%BF%E5%BA%A6.html</guid><description>&lt;p&gt;值得吐槽的是居然连求长度这么基础的方法，Erlang都没有统一起来。
分为len和size两大对立阵营：&lt;/p&gt;
&lt;h3 id="len阵营"&gt;len阵营
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;列表（字符串是列表的一种）的长度用&lt;code&gt;length/1&lt;/code&gt;或&lt;code&gt;string:len/1&lt;/code&gt;。
别看后面那个打着string开头，对于不是字符串的列表也照用不误，
从源代码看其实就是前一个的马甲。&lt;/li&gt;
&lt;li&gt;queue模块是len阵营的，使用&lt;code&gt;queue:len/1&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="size阵营"&gt;size阵营
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;二进制串的长度用&lt;code&gt;size/1&lt;/code&gt;，或是用&lt;code&gt;byte_size/1&lt;/code&gt;和&lt;code&gt;bit_size/1&lt;/code&gt;也行，分别是
比特长度和位长度，1byte = 8bit。&lt;/li&gt;
&lt;li&gt;元组的长度也用&lt;code&gt;size/1&lt;/code&gt;，等于其元素的个数。元组的比特长度和位长度不可用。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;dict&lt;/code&gt;，&lt;code&gt;sets&lt;/code&gt;，&lt;code&gt;orddict&lt;/code&gt;，&lt;code&gt;ordsets&lt;/code&gt;，&lt;code&gt;array&lt;/code&gt;, &lt;code&gt;gb_trees&lt;/code&gt;, &lt;code&gt;gb_sets&lt;/code&gt; 这几个模块也是size阵营的，使用其各自模块
下的size函数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;iolist&lt;/code&gt; 有BIF &lt;code&gt;iolist_size/1&lt;/code&gt;可用.&lt;/li&gt;
&lt;li&gt;ets比较特别，使用&lt;code&gt;ets:info(Tab, size)&lt;/code&gt;来获取长度，Tab是表的id，或是已注册的表的名字。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外，特立独行的“原子”没有长度。&lt;/p&gt;
&lt;hr&gt;
&lt;h4 id="更新2013年9月13日"&gt;更新(2013年9月13日)
&lt;/h4&gt;&lt;p&gt;其实Erlang对这两个方法的区分也是道理的, len是O(n)时是复杂度的函数 (是不是觉得这是另一种蛋疼),
而size是O(1)的. 换句话说就是数据长度越大, 取len的时间越长, 但取size用的时间却不受长度影响.&lt;/p&gt;</description></item></channel></rss>