Go Bue !
You are what you do.
2016-07-06T14:22:02.195Z
http://gobue.com/
Nurture Passes Nature.
Hexo
Elixir-散列表、散列字典、关键字列表、集合与结构体
http://gobue.com/2016/07/06/Elixir-散列表、散列字典、关键字列表、集合与结构体/
2016-07-06T14:11:57.000Z
2016-07-06T14:22:02.195Z
<h2 id="字典"><a href="#字典" class="headerlink" title="字典"></a>字典</h2><p>散列表和散列字典都实现了 <code>Dict</code> 的行为。</p>
<p>关键字模块也实现了,但是关键字列表允许出现重复的值,但是要用 <code>Keyword</code> 模块才能访问。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">values</span></span>(dict), <span class="symbol">do:</span> dict |> Dict.values |> Enum.sum </span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">iex> hd = [<span class="symbol">one:</span> <span class="number">1</span>,<span class="symbol">two:</span> <span class="number">2</span>,<span class="symbol">three:</span> <span class="number">3</span>] |> Enum.into HashDict.new</span><br><span class="line"><span class="comment">#HashDict<[two: 2, one: 1, three: 3]></span></span><br><span class="line">iex> IO.puts Demo.values(hd)</span><br><span class="line"><span class="number">6</span></span><br><span class="line"><span class="symbol">:ok</span></span><br></pre></td></tr></table></figure>
<a id="more"></a>
<p>其他kpi类似<br><code>Dict.get(kw_list, :likes)</code> 获取<br><code>Dict.drop(hashdict, [:where, :likes])</code> 移除<br><code>Dict.put(hashdict, :also_likes, "Ruby")</code> 增加<br><code>Dict.merge(map, hashdict)</code> 合并<br>等等..</p>
<h2 id="散列表模式匹配和更新"><a href="#散列表模式匹配和更新" class="headerlink" title="散列表模式匹配和更新"></a>散列表模式匹配和更新</h2><h3 id="散列表"><a href="#散列表" class="headerlink" title="散列表"></a>散列表</h3><p>格式: <code>%{_key, _value}</code></p>
<h3 id="模式匹配"><a href="#模式匹配" class="headerlink" title="模式匹配"></a>模式匹配</h3><p>匹配代码类似如下:</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line">iex(<span class="number">1</span>)> people = [</span><br><span class="line">...(<span class="number">1</span>)> </span><br><span class="line">...(<span class="number">1</span>)> %{ <span class="symbol">name:</span> <span class="string">"jack"</span>, <span class="symbol">height:</span> <span class="number">188</span>},</span><br><span class="line">...(<span class="number">1</span>)> </span><br><span class="line">...(<span class="number">1</span>)> %{ <span class="symbol">name:</span> <span class="string">"rose"</span>, <span class="symbol">height:</span> <span class="number">168</span>},</span><br><span class="line">...(<span class="number">1</span>)> </span><br><span class="line">...(<span class="number">1</span>)> %{ <span class="symbol">name:</span> <span class="string">"tom"</span>, <span class="symbol">height:</span> <span class="number">185</span>},</span><br><span class="line">...(<span class="number">1</span>)> </span><br><span class="line">...(<span class="number">1</span>)> %{ <span class="symbol">name:</span> <span class="string">"jetty"</span>, <span class="symbol">height:</span> <span class="number">20</span>},</span><br><span class="line">...(<span class="number">1</span>)> </span><br><span class="line">...(<span class="number">1</span>)> %{ <span class="symbol">name:</span> <span class="string">"lucy"</span>, <span class="symbol">height:</span> <span class="number">170</span>}</span><br><span class="line">...(<span class="number">1</span>)> </span><br><span class="line">...(<span class="number">1</span>)> ]</span><br><span class="line">[%{<span class="symbol">height:</span> <span class="number">188</span>, <span class="symbol">name:</span> <span class="string">"jack"</span>}, %{<span class="symbol">height:</span> <span class="number">168</span>, <span class="symbol">name:</span> <span class="string">"rose"</span>},</span><br><span class="line"> %{<span class="symbol">height:</span> <span class="number">185</span>, <span class="symbol">name:</span> <span class="string">"tom"</span>}, %{<span class="symbol">height:</span> <span class="number">20</span>, <span class="symbol">name:</span> <span class="string">"jetty"</span>},</span><br><span class="line"> %{<span class="symbol">height:</span> <span class="number">170</span>, <span class="symbol">name:</span> <span class="string">"lucy"</span>}]</span><br><span class="line">iex(<span class="number">2</span>)> <span class="keyword">for</span> person = %{ <span class="symbol">height:</span> height} <- people,</span><br><span class="line">...(<span class="number">2</span>)> height > <span class="number">180</span>,</span><br><span class="line">...(<span class="number">2</span>)> <span class="symbol">do:</span> IO.inspect person</span><br><span class="line">%{<span class="symbol">height:</span> <span class="number">188</span>, <span class="symbol">name:</span> <span class="string">"jack"</span>}</span><br><span class="line">%{<span class="symbol">height:</span> <span class="number">185</span>, <span class="symbol">name:</span> <span class="string">"tom"</span>}</span><br><span class="line">[%{<span class="symbol">height:</span> <span class="number">188</span>, <span class="symbol">name:</span> <span class="string">"jack"</span>}, %{<span class="symbol">height:</span> <span class="number">185</span>, <span class="symbol">name:</span> <span class="string">"tom"</span>}]</span><br></pre></td></tr></table></figure>
<h3 id="更新值"><a href="#更新值" class="headerlink" title="更新值"></a>更新值</h3><p>散列表是不可变的,所以更新后会产生新的列表。</p>
<p>更新散列表语法:<br><code>new_map = %{ old_map, | key => value, ...}</code></p>
<p>具体代码:</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> m = %{<span class="symbol">a:</span> <span class="number">1</span>, <span class="symbol">b:</span> <span class="number">2</span>, <span class="symbol">c:</span> <span class="number">3</span>}</span><br><span class="line">%{<span class="symbol">a:</span> <span class="number">1</span>, <span class="symbol">b:</span> <span class="number">2</span>, <span class="symbol">c:</span> <span class="number">3</span>}</span><br><span class="line">iex> new_map = %{m | <span class="symbol">b:</span> <span class="number">3</span>, <span class="symbol">c:</span> <span class="number">4</span>} </span><br><span class="line">%{<span class="symbol">a:</span> <span class="number">1</span>, <span class="symbol">b:</span> <span class="number">3</span>, <span class="symbol">c:</span> <span class="number">4</span>}</span><br></pre></td></tr></table></figure>
<h2 id="使用结构体"><a href="#使用结构体" class="headerlink" title="使用结构体"></a>使用结构体</h2><p>当你想创建一个带类型的散列表,具有固定的字段集合以及与之对应的默认值的散列表,并且能像匹配内容一样进行模式匹配的时候,我们可以使用- <code>结构体</code>,<code>defstruct</code>。</p>
<p>在模块内部使用 <code>defstruct</code> 宏来定义散列表的性质。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="comment">#结构体</span></span><br><span class="line"> defstruct <span class="symbol">name:</span> <span class="string">""</span>, <span class="symbol">age:</span> <span class="number">18</span>, <span class="symbol">allow_in:</span> <span class="keyword">false</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">#是否能参加舞会</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">may_attend_party</span></span>(attendee = %Demo{}) <span class="keyword">do</span></span><br><span class="line"> attendee.age > <span class="number">18</span> && attendee.allow_in </span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> jack = %Demo{<span class="symbol">name:</span> <span class="string">"jack"</span>, <span class="symbol">age:</span> <span class="number">19</span>, <span class="symbol">allow_in:</span> <span class="keyword">true</span>}</span><br><span class="line">%Demo{<span class="symbol">age:</span> <span class="number">19</span>, <span class="symbol">allow_in:</span> <span class="keyword">true</span>, <span class="symbol">name:</span> <span class="string">"jack"</span>}</span><br><span class="line">iex> Demo.may_attend_party(jack)</span><br><span class="line"><span class="keyword">true</span></span><br></pre></td></tr></table></figure>
<h3 id="另一种方式访问结构体"><a href="#另一种方式访问结构体" class="headerlink" title="另一种方式访问结构体"></a>另一种方式访问结构体</h3><p>散列表能够通过 some_map[:name] 的方式访问,而我们前面的结构体是通过点符号。</p>
<p>由于散列表实现了 <code>Access</code> 协议(定义了使用方括号访问属性的能力),而结构体没有,所以我们可以通过添加简单的指令来使结构体拥有这项功能。</p>
<p>方式:<code>@derive Access</code></p>
<p>改造下之前的代码:</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="variable">@derive</span> Access</span><br><span class="line"> <span class="comment">#结构体</span></span><br><span class="line"> defstruct <span class="symbol">name:</span> <span class="string">""</span>, <span class="symbol">age:</span> <span class="number">18</span>, <span class="symbol">allow_in:</span> <span class="keyword">false</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">#是否能参加舞会</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">may_attend_party</span></span>(attendee = %Demo{}) <span class="keyword">do</span></span><br><span class="line"> attendee.age > <span class="number">18</span> && attendee.allow_in </span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<p>然后你就可以通过方括号访问里面的属性了。</p>
<h2 id="嵌套结构体"><a href="#嵌套结构体" class="headerlink" title="嵌套结构体"></a>嵌套结构体</h2><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Customer</span></span> <span class="keyword">do</span></span><br><span class="line"> defstruct <span class="symbol">name:</span> <span class="string">""</span>, <span class="symbol">company:</span> <span class="string">""</span></span><br><span class="line"><span class="keyword">end</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#嵌套ower结构体</span></span><br><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">BugReport</span></span> <span class="keyword">do</span></span><br><span class="line"> defstruct <span class="symbol">owner:</span> %{}, <span class="symbol">details:</span> <span class="string">""</span>, <span class="symbol">severity:</span> <span class="number">1</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">iex> report = %BugReport{<span class="symbol">owner:</span> %Customer{<span class="symbol">name:</span> <span class="string">"Dave"</span>, <span class="symbol">company:</span> <span class="string">"Pragmatic"</span>}, <span class="symbol">details:</span> <span class="string">"broken"</span>}</span><br><span class="line">``` </span><br><span class="line">`owner` 属性本身也是一个机构体。</span><br><span class="line"></span><br><span class="line">可以通过点符号访问嵌套字段:</span><br><span class="line">```Elixir</span><br><span class="line">iex> report.owner.company</span><br></pre></td></tr></table></figure>
<p>但是更新时候特别麻烦,我们可以用 <code>Elixir</code> 的嵌套字典访问函数。</p>
<p><code>put_in</code> 可以设定嵌套结构里面的值。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">put_in(report.owner.company, <span class="string">"PragProg"</span>)</span><br></pre></td></tr></table></figure>
<p><code>update_in</code> 可以让我们在结构体的某个值上执行一个函数。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">update_in(report.owner.name, &(<span class="string">"Mr."</span> <> &<span class="number">1</span>))</span><br></pre></td></tr></table></figure>
<p>另外还有两个嵌套函数,<code>get_in</code>,<code>get_and_update_in</code>,可以访问<code>iex</code> 的文档获得更多资料。</p>
<h2 id="动态嵌套访问"><a href="#动态嵌套访问" class="headerlink" title="动态嵌套访问"></a>动态嵌套访问</h2><p><code>get_in</code>, <code>put_in</code>, 等函数都接收一个键列表作为单独的参数,动态获取亲淘结构体中的字段。</p>
<p>类似如下:</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">IO.inspect get_in(person, [<span class="symbol">:son</span>, <span class="symbol">:son</span>, <span class="symbol">:name</span>])</span><br></pre></td></tr></table></figure>
<p>获取孙子的名字。 : )</p>
<p><code>put_in</code> 类似</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">IO.inspect put_in(person, [<span class="symbol">:son</span>, <span class="symbol">:son</span>, <span class="symbol">:name</span>], <span class="string">"shadan"</span>)</span><br></pre></td></tr></table></figure>
<p>给孙子取个名字。 : )</p>
<h2 id="HashSet"><a href="#HashSet" class="headerlink" title="HashSet"></a>HashSet</h2><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line">iex> set1 = Enum.into <span class="number">1</span>..<span class="number">5</span>, HashSet.new</span><br><span class="line"><span class="comment">#HashSet<[2, 3, 4, 1, 5]></span></span><br><span class="line">iex> Set.member? set1,<span class="number">3</span> <span class="comment">#是否在set里</span></span><br><span class="line"><span class="keyword">true</span></span><br><span class="line">iex> Set.member? set1,<span class="number">8</span></span><br><span class="line"><span class="keyword">false</span></span><br><span class="line">iex> set2 = Enum.into <span class="number">3</span>..<span class="number">8</span>, HashSet.new</span><br><span class="line"><span class="comment">#HashSet<[7, 6, 3, 4, 5, 8]></span></span><br><span class="line">iex> Set.union set1, set2 <span class="comment">#合并</span></span><br><span class="line"><span class="comment">#HashSet<[7, 6, 2, 3, 4, 5, 1, 8]></span></span><br><span class="line">iex> Set.difference set1,set2 <span class="comment">#set相对于set2的不同</span></span><br><span class="line"><span class="comment">#HashSet<[2, 1]></span></span><br><span class="line">iex> Set.difference set2,set1 <span class="comment">#set2相对于set1的不同</span></span><br><span class="line"><span class="comment">#HashSet<[7, 6, 8]></span></span><br><span class="line">iex> Set.intersection set2,set1 <span class="comment">#交叉部分</span></span><br><span class="line"><span class="comment">#HashSet<[3, 4, 5]></span></span><br><span class="line">iex></span><br></pre></td></tr></table></figure>
<p>而已看出 <code>Set</code> 并为维护顺序。</p>
<h2 id="忘记对象的思想"><a href="#忘记对象的思想" class="headerlink" title="忘记对象的思想"></a>忘记对象的思想</h2><p>记住 <code>Elixir</code> 是门函数式的编程语言。</p>
<p>当用到 <code>defstruct</code> 的时候,有面向对象编程经验的人会觉得这不就是 <code>类</code> 的概念么?</p>
<p>但是,请忘记过去面向对象的思想,做一个纯粹的开发。</p>
<h2 id="字典"><a href="#字典" class="headerlink" title="字典"></a>字典</h2><p>散列表和散列字典都实现了 <code>Dict</code> 的行为。</p>
<p>关键字模块也实现了,但是关键字列表允许出现重复的值,但是要用 <code>Keyword</code> 模块才能访问。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">values</span></span>(dict), <span class="symbol">do:</span> dict |> Dict.values |> Enum.sum </span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">iex> hd = [<span class="symbol">one:</span> <span class="number">1</span>,<span class="symbol">two:</span> <span class="number">2</span>,<span class="symbol">three:</span> <span class="number">3</span>] |> Enum.into HashDict.new</span><br><span class="line"><span class="comment">#HashDict<[two: 2, one: 1, three: 3]></span></span><br><span class="line">iex> IO.puts Demo.values(hd)</span><br><span class="line"><span class="number">6</span></span><br><span class="line"><span class="symbol">:ok</span></span><br></pre></td></tr></table></figure>
Elixir-列表与递归
http://gobue.com/2016/07/06/Elixir-列表与递归/
2016-07-06T14:11:44.000Z
2016-07-06T14:17:01.211Z
<blockquote class="blockquote-center"><p><strong>递归</strong> 才是处理列表的最佳工具。</p>
</blockquote>
<h2 id="头部和尾部"><a href="#头部和尾部" class="headerlink" title="头部和尾部"></a>头部和尾部</h2><p>列表可以通过管道运算符 <code>|</code> 来分隔头部和尾部。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">iex> [head | tail] = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">iex> head</span><br><span class="line"><span class="number">1</span></span><br><span class="line">iex> tail</span><br><span class="line">[<span class="number">2</span>, <span class="number">3</span>]</span><br></pre></td></tr></table></figure>
<ul>
<li>空列表长度为 <code>0</code></li>
<li>列表长度等于列表尾部长度 + 1</li>
</ul>
<h2 id="递归计算列表长度"><a href="#递归计算列表长度" class="headerlink" title="递归计算列表长度"></a>递归计算列表长度</h2><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">len</span></span>([]), <span class="symbol">do:</span> <span class="number">0</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">len</span></span>([_head | tail]), <span class="symbol">do:</span> len(tail) + <span class="number">1</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">iex> Demo.len [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>]</span><br><span class="line"><span class="number">5</span></span><br></pre></td></tr></table></figure>
<p><code>head变量没有被用到,可以使用_开头的变量名来消除编译警告(_head)。</code><br><a id="more"></a></p>
<p>## 创建映射函数</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">map</span></span>([], _func), <span class="symbol">do:</span> []</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">map</span></span>([head | tail], func), <span class="symbol">do:</span> [func.(head) | map(tail, func)]</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<p><code>_func 没有被使用,所以_开头</code></p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> Demo.len [<span class="number">1</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>], &(&<span class="number">1</span>*<span class="number">10</span>)</span><br><span class="line">[<span class="number">10</span>, <span class="number">30</span>, <span class="number">40</span>, <span class="number">50</span>]</span><br><span class="line">iex> Demo.len [<span class="number">1</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>], &(&<span class="number">1</span>/<span class="number">10</span>)</span><br><span class="line">[<span class="number">0</span>.<span class="number">1</span>, <span class="number">0</span>.<span class="number">3</span>, <span class="number">0</span>.<span class="number">4</span>, <span class="number">0</span>.<span class="number">5</span>]</span><br></pre></td></tr></table></figure>
<p>方便对列表进行操作。</p>
<h2 id="递归时跟踪值"><a href="#递归时跟踪值" class="headerlink" title="递归时跟踪值"></a>递归时跟踪值</h2><p>列表求和:</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="comment">#公开函数,内部调用_sum</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">sum</span></span>(list), <span class="symbol">do:</span> _sum(list, <span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"> <span class="comment">#私有函数,递归求和</span></span><br><span class="line"> <span class="function"><span class="keyword">defp</span> <span class="title">_sum</span></span>([], total), <span class="symbol">do:</span> total</span><br><span class="line"> <span class="function"><span class="keyword">defp</span> <span class="title">_sum</span></span>([head | tail], total), <span class="symbol">do:</span> _sum(tail, head + total)</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> Demo.sum [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>]</span><br><span class="line"><span class="number">15</span></span><br><span class="line">iex> Demo.sum [<span class="number">10</span>,<span class="number">20</span>,<span class="number">30</span>,<span class="number">40</span>,<span class="number">50</span>]</span><br><span class="line"><span class="number">150</span></span><br></pre></td></tr></table></figure>
<ul>
<li>第一 <code>defp</code> 来定义私有函数</li>
<li>第二给辅助函数取和公开函数一样的名称,但以 <code>_</code> 开头。</li>
</ul>
<h2 id="更复杂的列表"><a href="#更复杂的列表" class="headerlink" title="更复杂的列表"></a>更复杂的列表</h2><p>不是所有的列表问题都可以简单的一次处理一个元素来解决,幸好我们有连接运算符 <code>|</code>,左边允许有多个值。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">swap</span></span>([]), <span class="symbol">do:</span> []</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">swap</span></span>([a,b | tail]), <span class="symbol">do:</span> [b,a | swap(tail)]</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">swap</span></span>(<span class="number">_</span>), <span class="symbol">do:</span> raise <span class="string">"error, odd number of elements is not allowed"</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">iex(<span class="number">37</span>)> Demo.swap [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>]</span><br><span class="line">[<span class="number">2</span>, <span class="number">1</span>, <span class="number">4</span>, <span class="number">3</span>, <span class="number">6</span>, <span class="number">5</span>]</span><br><span class="line">iex(<span class="number">38</span>)> Demo.swap [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>] </span><br><span class="line">** (RuntimeError) error, odd number of elements is <span class="keyword">not</span> allowed</span><br><span class="line"> <span class="symbol">e:</span>/Elixir_workspace/hello.<span class="symbol">exs:</span><span class="number">4</span>: Demo.swap/<span class="number">1</span></span><br><span class="line"> <span class="symbol">e:</span>/Elixir_workspace/hello.<span class="symbol">exs:</span><span class="number">3</span>: Demo.swap/<span class="number">1</span></span><br></pre></td></tr></table></figure>
<p><code>raise 抛出一个异常,相当于 java 的 throw
对不关心的域使用 _ 占位符</code></p>
<blockquote class="blockquote-center"><p><strong>递归</strong> 才是处理列表的最佳工具。</p>
</blockquote>
<h2 id="头部和尾部"><a href="#头部和尾部" class="headerlink" title="头部和尾部"></a>头部和尾部</h2><p>列表可以通过管道运算符 <code>|</code> 来分隔头部和尾部。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">iex> [head | tail] = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">iex> head</span><br><span class="line"><span class="number">1</span></span><br><span class="line">iex> tail</span><br><span class="line">[<span class="number">2</span>, <span class="number">3</span>]</span><br></pre></td></tr></table></figure>
<ul>
<li>空列表长度为 <code>0</code></li>
<li>列表长度等于列表尾部长度 + 1</li>
</ul>
<h2 id="递归计算列表长度"><a href="#递归计算列表长度" class="headerlink" title="递归计算列表长度"></a>递归计算列表长度</h2><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">len</span></span>([]), <span class="symbol">do:</span> <span class="number">0</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">len</span></span>([_head | tail]), <span class="symbol">do:</span> len(tail) + <span class="number">1</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">iex> Demo.len [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>]</span><br><span class="line"><span class="number">5</span></span><br></pre></td></tr></table></figure>
<p><code>head变量没有被用到,可以使用_开头的变量名来消除编译警告(_head)。</code><br>
Elixir-模块与命名函数
http://gobue.com/2016/07/06/Elixir-模块与命名函数/
2016-07-06T14:11:23.000Z
2016-07-06T14:14:27.850Z
<p>上节接触到了匿名函数,这次了解下命名函数。</p>
<p><code>Elixir</code> 的命名函数必须写在模块里。</p>
<h2 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h2><p>定义模块</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">double</span></span>(n) <span class="keyword">do</span> </span><br><span class="line"> n * <span class="number">2</span> </span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<p><strong>通常单行使用do:语法,多行使用do…end语法。</strong></p>
<p>命令提示符/终端时候用 <code>iex</code> + 文件<br>加载模块,<code>iex</code>模式下用 <code>c</code> + 文件</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">iex> c <span class="string">"E:\\Elixir_workspace\\hello.exs"</span></span><br><span class="line">iex> Demo.double <span class="number">5</span> </span><br><span class="line"><span class="number">10</span></span><br></pre></td></tr></table></figure>
<h2 id="函数的模式匹配"><a href="#函数的模式匹配" class="headerlink" title="函数的模式匹配"></a>函数的模式匹配</h2><p>看示例:求 <code>n</code> 的阶乘 (递归)</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">of</span></span>(<span class="number">0</span>), <span class="symbol">do:</span> <span class="number">1</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">of</span></span>(n), <span class="symbol">do:</span> n * of(n-<span class="number">1</span>)</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">iex> Demo.of <span class="number">5</span></span><br><span class="line"><span class="number">120</span></span><br></pre></td></tr></table></figure>
<p>有一点要注意,子句顺序不同会产生不同的结果。<code>Elixir</code>会自上而下依次尝试,执行最先匹配的一项。</p>
<p>所以如果上述 <code>def</code> 位置交换将会行不通;第一个定义总是匹配,而第二个永远不会被调用。<br><a id="more"></a></p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">#error</span></span><br><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">of</span></span>(n), <span class="symbol">do:</span> n * of(n-<span class="number">1</span>)</span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">of</span></span>(<span class="number">0</span>), <span class="symbol">do:</span> <span class="number">1</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<h2 id="哨兵子句"><a href="#哨兵子句" class="headerlink" title="哨兵子句"></a>哨兵子句</h2><p>加入需要对类型进行判断,或者参数做些匹配怎么办?</p>
<p>我们用哨兵子句(<code>guard clause</code>),一个或多个由 <code>when</code> 关键字接在函数定义之后的断言。</p>
<figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">Elixir</span><br><span class="line">defmodule Demo do</span><br><span class="line"> def what_is(x) when is_number(x), do: IO.puts "#{x} is a number"</span><br><span class="line"> def what_is(x) when is_list(x), do: IO.puts "#{x} is a list"</span><br><span class="line"> def what_is(x) when is_atom(x), do: IO.puts "#{x} is a atom"</span><br><span class="line"> def what_is(x), do: IO.puts "#{x} is a unkown type"</span><br><span class="line">end</span><br></pre></td></tr></table></figure>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">iex> c <span class="string">"E:\\Elixir_workspace\\hello.exs"</span></span><br><span class="line">[Demo]</span><br><span class="line">iex> Demo.what_is <span class="number">3</span></span><br><span class="line"><span class="number">3</span> is a number</span><br><span class="line"><span class="symbol">:ok</span></span><br><span class="line">iex> Demo.what_is [<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]</span><br><span class="line">^A^B^C is a list</span><br><span class="line"><span class="symbol">:ok</span></span><br><span class="line">iex> Demo.what_is <span class="symbol">:red</span> </span><br><span class="line">red is a atom</span><br><span class="line"><span class="symbol">:ok</span></span><br><span class="line">iex> Demo.what_is <span class="string">"333"</span></span><br><span class="line"><span class="number">333</span> is a unkown type</span><br><span class="line"><span class="symbol">:ok</span></span><br></pre></td></tr></table></figure>
<p><code>[1, 2, 3]</code>分别打印的时候正好能匹配字符,<code>Elixir</code>会自动以对应字符形式输出。</p>
<p>优化之前的递归,以免输入负数造成死循环。<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">of</span></span>(<span class="number">0</span>), <span class="symbol">do:</span> <span class="number">1</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">of</span></span>(n) <span class="keyword">when</span> n > <span class="number">0</span>, <span class="symbol">do:</span> n * of(n-<span class="number">1</span>)</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure></p>
<p>注意:哨兵子句不支持 <code>||</code> 和 <code>&&</code> </p>
<h2 id="默认参数"><a href="#默认参数" class="headerlink" title="默认参数"></a>默认参数</h2><p><strong>param</strong> <code>\\</code> <strong>value</strong> 的语法可给param设置默认值。<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">func</span></span>(p1, p2 \\ <span class="number">2</span>, p3 \\ <span class="number">3</span>, p4) <span class="keyword">do</span></span><br><span class="line"> IO.inspect [p1, p2, p3, p4]</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure></p>
<p>体会下以下输出结果。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">iex> c <span class="string">"E:\\Elixir_workspace\\hello.exs"</span></span><br><span class="line">[Demo]</span><br><span class="line">iex> Demo.func <span class="number">1</span>,<span class="number">4</span></span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line">iex> Demo.func <span class="number">2</span> </span><br><span class="line">** (UndefinedFunctionError) undefined function Demo.func/<span class="number">1</span></span><br><span class="line"> Demo.func(<span class="number">2</span>)</span><br><span class="line">iex> Demo.func <span class="number">1</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span></span><br><span class="line">[<span class="number">1</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line">[<span class="number">1</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line">iex> Demo.func <span class="number">1</span>,<span class="number">3</span>,<span class="number">4</span> </span><br><span class="line">[<span class="number">1</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br><span class="line">[<span class="number">1</span>, <span class="number">3</span>, <span class="number">3</span>, <span class="number">4</span>]</span><br></pre></td></tr></table></figure>
<h2 id="私有函数"><a href="#私有函数" class="headerlink" title="私有函数"></a>私有函数</h2><p><code>defp</code> 来定义私有函数,该函数仅能在生命它的模块内被调用。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">def</span> <span class="title">fun</span></span>(a) <span class="keyword">when</span> is_list(a), <span class="symbol">do:</span> <span class="keyword">true</span></span><br><span class="line"><span class="function"><span class="keyword">defp</span> <span class="title">fun</span></span>(a), <span class="symbol">do:</span> <span class="keyword">false</span></span><br></pre></td></tr></table></figure>
<h2 id="管道运算符"><a href="#管道运算符" class="headerlink" title="管道运算符"></a>管道运算符</h2><p>关键字: <code>|></code></p>
<p>类似 <code>linux</code> 的管道,前面的输出作为后面的输入。</p>
<p>举个例子:</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">iex> (<span class="number">1</span>..<span class="number">10</span>) |> Enum.map(&(&<span class="number">1</span> * &<span class="number">1</span>)) |> Enum.filter(&(&<span class="number">1</span> < <span class="number">50</span>))</span><br><span class="line">[<span class="number">1</span>, <span class="number">4</span>, <span class="number">9</span>, <span class="number">16</span>, <span class="number">25</span>, <span class="number">36</span>, <span class="number">49</span>]</span><br><span class="line">iex></span><br></pre></td></tr></table></figure>
<p>第一段,一个区间<br>流向第二段,区间的每个值平方<br>新的列表流向第三段,筛选出 <code>< 50</code> 的值。<br>最后输出。(涉及一些自带函数就不多做解释。如:<code>Enum.filter</code>)</p>
<h2 id="内外模块"><a href="#内外模块" class="headerlink" title="内外模块"></a>内外模块</h2><p>在外部访问嵌套模块内的函数,需要加上所有的模块名作为前缀。<br>(同一个模块内访问不需要)</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Outer</span></span> <span class="keyword">do</span> </span><br><span class="line"> <span class="class"><span class="keyword">defmodule</span> <span class="title">Inner</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">inner_func</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">outer_func</span></span> <span class="keyword">do</span></span><br><span class="line"> Inner.inner_func</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<h2 id="import-指令"><a href="#import-指令" class="headerlink" title="import 指令"></a>import 指令</h2><p><code>import</code> 指令将模块内的函数/宏引入到当前作用域。<br><code>import</code> 可以减少一遍遍重复模块名,保持源文件的整洁。</p>
<p>如下:</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Outer</span></span> <span class="keyword">do</span> </span><br><span class="line"> <span class="class"><span class="keyword">defmodule</span> <span class="title">func1</span></span> <span class="keyword">do</span></span><br><span class="line"> List.flatten [<span class="number">1</span>, [<span class="number">2</span>, <span class="number">3</span>], <span class="number">4</span>]</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"> </span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">func2</span></span> <span class="keyword">do</span></span><br><span class="line"> import List, <span class="symbol">only:</span> [<span class="symbol">flatten:</span> <span class="number">1</span>]</span><br><span class="line"> flatten [<span class="number">1</span>, [<span class="number">2</span>, <span class="number">3</span>], <span class="number">4</span>]</span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<p>完成语法:<br><code>import Module [,only: |except: ]</code></p>
<p>后面跟随一组 <code>name: arity</code> 对。<br>尽可能的缩小对 <code>import</code> 的作用域。</p>
<h2 id="alias-指令"><a href="#alias-指令" class="headerlink" title="alias 指令"></a>alias 指令</h2><p><code>alias</code> 指令模块创建别名,显然,它的作用是减少输入。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">alias</span> Mix.Tasks.Doctest, as Doctest</span><br></pre></td></tr></table></figure>
<h2 id="模块属性"><a href="#模块属性" class="headerlink" title="模块属性"></a>模块属性</h2><p>每个 <code>Elixir</code> 模块都有与之关联的元数据,元数据每一项成为模块的属性。模块内部可以通过名称前加 <code>@</code> 符号访问属性。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">@name</span> value</span><br></pre></td></tr></table></figure>
<p>并不是传统意义上的变量,仅作为配置和元数据使用。</p>
<h2 id="Elixir-函数库"><a href="#Elixir-函数库" class="headerlink" title="Elixir 函数库"></a>Elixir 函数库</h2><p>可以快速浏览下官网上 <code>Elixir</code> 已有的模块,还有如 <code>hex.pm</code> 和 <code>Github</code> 。</p>
<p>上节接触到了匿名函数,这次了解下命名函数。</p>
<p><code>Elixir</code> 的命名函数必须写在模块里。</p>
<h2 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h2><p>定义模块</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">double</span></span>(n) <span class="keyword">do</span> </span><br><span class="line"> n * <span class="number">2</span> </span><br><span class="line"> <span class="keyword">end</span></span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<p><strong>通常单行使用do:语法,多行使用do…end语法。</strong></p>
<p>命令提示符/终端时候用 <code>iex</code> + 文件<br>加载模块,<code>iex</code>模式下用 <code>c</code> + 文件</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">iex> c <span class="string">"E:\\Elixir_workspace\\hello.exs"</span></span><br><span class="line">iex> Demo.double <span class="number">5</span> </span><br><span class="line"><span class="number">10</span></span><br></pre></td></tr></table></figure>
<h2 id="函数的模式匹配"><a href="#函数的模式匹配" class="headerlink" title="函数的模式匹配"></a>函数的模式匹配</h2><p>看示例:求 <code>n</code> 的阶乘 (递归)</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">defmodule</span> <span class="title">Demo</span></span> <span class="keyword">do</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">of</span></span>(<span class="number">0</span>), <span class="symbol">do:</span> <span class="number">1</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">of</span></span>(n), <span class="symbol">do:</span> n * of(n-<span class="number">1</span>)</span><br><span class="line"><span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">iex> Demo.of <span class="number">5</span></span><br><span class="line"><span class="number">120</span></span><br></pre></td></tr></table></figure>
<p>有一点要注意,子句顺序不同会产生不同的结果。<code>Elixir</code>会自上而下依次尝试,执行最先匹配的一项。</p>
<p>所以如果上述 <code>def</code> 位置交换将会行不通;第一个定义总是匹配,而第二个永远不会被调用。<br>
Elixir-匿名函数
http://gobue.com/2016/06/29/Elixir-匿名函数/
2016-06-29T13:13:52.000Z
2016-06-29T13:15:34.634Z
<p><code>Elixir</code>是函数式语言,所以函数式它的一种基本类型。</p>
<h2 id="一般语法"><a href="#一般语法" class="headerlink" title="一般语法"></a>一般语法</h2><p>匿名函数用 <strong>fn</strong> 创建</p>
<pre>
fn
parameter-list -> body
parameter-list -> body ...
end
</pre>
<p>一个参数列表(圆括号可省略),一个函数体,二者通过 <code>-></code> 隔开。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">iex> sum = <span class="keyword">fn</span> (a, b) -> a + b <span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<p>调用的时候<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">iex> sum.(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line"><span class="number">3</span></span><br></pre></td></tr></table></figure></p>
<a id="more"></a>
<h2 id="函数模式匹配"><a href="#函数模式匹配" class="headerlink" title="函数模式匹配"></a>函数模式匹配</h2><p>回忆一下,<code>Elixir</code> 没有赋值概念,是将值和模式进行匹配。<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> swap = <span class="keyword">fn</span> {a, b} -> {b, a} <span class="keyword">end</span></span><br><span class="line">...</span><br><span class="line">iex> swap.({<span class="number">1</span>, <span class="number">2</span>})</span><br><span class="line">{<span class="number">2</span>, <span class="number">1</span>}</span><br></pre></td></tr></table></figure></p>
<h2 id="一个函数,多个函数体"><a href="#一个函数,多个函数体" class="headerlink" title="一个函数,多个函数体"></a>一个函数,多个函数体</h2><p>例如打开文件的时候,对结果进行多个匹配。<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> handle_open = <span class="keyword">fn</span></span><br><span class="line">...>{<span class="symbol">:ok</span>, file} -> <span class="string">"Read data: <span class="subst">#{IO.read(file, <span class="symbol">:line</span>)}</span>"</span></span><br><span class="line">...>{<span class="number">_</span>, error} -> <span class="string">"Error: <span class="subst">#{<span class="symbol">:file</span>.format_error(error)}</span>"</span></span><br><span class="line">...><span class="keyword">end</span></span><br></pre></td></tr></table></figure></p>
<p><code>_</code> 当参数可以省略的时候,用 <code>_</code> 去充当一个占位。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> handle_open.(File.open(<span class="string">"code/hello.exs"</span>))</span><br><span class="line"><span class="string">"Read data: IO.puts \"Hello,world!\"\n"</span></span><br><span class="line">iex> handle_open.(File.open(<span class="string">"nonexistent"</span>))</span><br><span class="line"><span class="string">"Error: no such file or directory"</span></span><br></pre></td></tr></table></figure>
<p>可见当文件存在,第一个参数会匹配<code>:ok</code>,走第一行函数体。<br>文件不存在时候,匹配第二行函数体,输出错误。</p>
<h2 id="函数中的函数"><a href="#函数中的函数" class="headerlink" title="函数中的函数"></a>函数中的函数</h2><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> fun1 = <span class="keyword">fn</span> -> <span class="keyword">fn</span> -> <span class="string">"Hello"</span> <span class="keyword">end</span> <span class="keyword">end</span></span><br><span class="line">...</span><br><span class="line">iex> fun1.().()</span><br><span class="line"><span class="string">"Hello"</span></span><br></pre></td></tr></table></figure>
<h2 id="闭包"><a href="#闭包" class="headerlink" title="闭包"></a>闭包</h2><p>刚才那段代码,改造一下:<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> fun1 = <span class="keyword">fn</span> name -> <span class="keyword">fn</span> -> <span class="string">"Hello,<span class="subst">#{name}</span>"</span> <span class="keyword">end</span> <span class="keyword">end</span></span><br><span class="line">...</span><br><span class="line">iex> fun1.(<span class="string">"jack"</span>).()</span><br><span class="line"><span class="string">"Hello,jack"</span></span><br></pre></td></tr></table></figure></p>
<p>可见,内部函数调用了外部函数的变量。</p>
<p>变量 <code>name</code> 被绑定到外部函数的作用域里,当定义内部函数的时候,它继承这个作用域并将 <code>name</code> 的绑定值传递到里面。</p>
<p>这就是闭包(<strong>closure</strong>):作用域将其中的变量绑定封闭起来,并将它们打包到稍后能被保存且使用的东西上。</p>
<h2 id="函数做为参数进行传递"><a href="#函数做为参数进行传递" class="headerlink" title="函数做为参数进行传递"></a>函数做为参数进行传递</h2><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">iex> fun1 = <span class="keyword">fn</span> name -> <span class="keyword">fn</span> -> <span class="string">"Hello,<span class="subst">#{name}</span>"</span> <span class="keyword">end</span> <span class="keyword">end</span></span><br><span class="line">...</span><br><span class="line">iex> fun2 = <span class="keyword">fn</span> (fun, name) -> fun.(name) <span class="keyword">end</span></span><br><span class="line">...</span><br><span class="line">iex> fun2.(fun1, <span class="string">"jack"</span>)</span><br><span class="line"><span class="string">"Hello,jack"</span></span><br></pre></td></tr></table></figure>
<p>另一个例子<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">iex> Enum.map [<span class="number">1</span>, <span class="number">2</span>], <span class="keyword">fn</span> elem -> elem * <span class="number">2</span> <span class="keyword">end</span></span><br><span class="line">[<span class="number">2</span>, <span class="number">4</span>]</span><br></pre></td></tr></table></figure></p>
<h2 id="amp-运算符"><a href="#amp-运算符" class="headerlink" title="& 运算符"></a>& 运算符</h2><p>创建简短辅助的函数很普遍,所以<code>Elixir</code>提供一个快捷的创建函数的方式。上面的例子,改造下:<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">iex> Enum.map [<span class="number">1</span>, <span class="number">2</span>], &(&<span class="number">1</span> * <span class="number">2</span>) <span class="keyword">end</span></span><br><span class="line">[<span class="number">2</span>, <span class="number">4</span>]</span><br></pre></td></tr></table></figure></p>
<p><code>Elixir</code>是函数式语言,所以函数式它的一种基本类型。</p>
<h2 id="一般语法"><a href="#一般语法" class="headerlink" title="一般语法"></a>一般语法</h2><p>匿名函数用 <strong>fn</strong> 创建</p>
<pre>
fn
parameter-list -> body
parameter-list -> body ...
end
</pre>
<p>一个参数列表(圆括号可省略),一个函数体,二者通过 <code>-></code> 隔开。</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">iex> sum = <span class="keyword">fn</span> (a, b) -> a + b <span class="keyword">end</span></span><br></pre></td></tr></table></figure>
<p>调用的时候<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">iex> sum.(<span class="number">1</span>, <span class="number">2</span>)</span><br><span class="line"><span class="number">3</span></span><br></pre></td></tr></table></figure></p>
Elixir-基础-内置类型
http://gobue.com/2016/06/29/Elixir-基础-内置类型/
2016-06-29T13:05:23.000Z
2016-06-29T13:10:06.321Z
<p><code>Elixir</code>内置类型有:</p>
<ul>
<li>值类型<ul>
<li>任意大小的整数</li>
<li>浮点数</li>
<li>原子</li>
<li>区间</li>
<li>正则表达式</li>
</ul>
</li>
<li>系统类型<ul>
<li>PID和端口</li>
<li>引用</li>
</ul>
</li>
<li>集合类型<ul>
<li>元组</li>
<li>列表</li>
<li>散列表</li>
<li>二进制 </li>
</ul>
</li>
</ul>
<p><code>Elixir</code>里其实 <strong>函数</strong> 也是类型。<br><a id="more"></a></p>
<h2 id="值类型"><a href="#值类型" class="headerlink" title="值类型"></a>值类型</h2><h3 id="整数"><a href="#整数" class="headerlink" title="整数"></a>整数</h3><p>整数字面量可被写作十进制(1234),十六进制(0xcafe),八进制(0o765)和二进制(0b1010)。</p>
<p>数值较大的时候可以用下划线分组。</p>
<blockquote>
<p>1_000_000<br>等同于:1000000</p>
</blockquote>
<h3 id="浮点数"><a href="#浮点数" class="headerlink" title="浮点数"></a>浮点数</h3><p>浮点数使用含小数点的十进制表示,小数点前后必须有一位数字,结尾指数可选。</p>
<blockquote>
<p>1.0<br>0.2456<br>0.314159el<br>314159.0e-5</p>
</blockquote>
<p>符合<code>IEEE754</code>标准双精度表示,拥有16位精度,指数最大达到10^308。</p>
<h3 id="原子"><a href="#原子" class="headerlink" title="原子"></a>原子</h3><p><strong>常量</strong>,用来表示某些东西的名字。以(:)开头,随后跟着一个原子单词或者<code>Elixir</code>运算符。<br>(原子的名字就是它的值,俩个同名原子总是相等的。)</p>
<blockquote>
<p>:ok<br>:is_binary?<br>:var@2<br>:<><br>:===<br>:”func/3”<br>:”long john silver”</p>
</blockquote>
<h3 id="区间"><a href="#区间" class="headerlink" title="区间"></a>区间</h3><p>区间被表示为,<code>开始</code>-<code>结束</code>,开始结束可以是任意值类型。但是如果你想遍历区间,两端必须是整数。</p>
<blockquote>
<p>1..10</p>
</blockquote>
<h3 id="正则表达式"><a href="#正则表达式" class="headerlink" title="正则表达式"></a>正则表达式</h3><p><code>Elixir</code>支持正则表达式,写作~r{regexp}或者~r{regexp}opts,{和}作为分隔符。<br>可用<code>Regex</code>模块操作正则表达式。<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">iex>Regex.run ~r{[aeiou]}, <span class="string">"caterpillar"</span></span><br><span class="line">[<span class="string">"a"</span>]</span><br></pre></td></tr></table></figure></p>
<h2 id="系统类型"><a href="#系统类型" class="headerlink" title="系统类型"></a>系统类型</h2><h3 id="PID和端口"><a href="#PID和端口" class="headerlink" title="PID和端口"></a>PID和端口</h3><p><code>PID</code>是本地或者远程的进程的引用。(当前PID值可以通过self获得。)<br>端口是读/写资源的引用。</p>
<h3 id="引用"><a href="#引用" class="headerlink" title="引用"></a>引用</h3><p><strong>make_ref</strong> 函数用于创建全局唯一的引用。</p>
<h2 id="集合类型"><a href="#集合类型" class="headerlink" title="集合类型"></a>集合类型</h2><h3 id="元组"><a href="#元组" class="headerlink" title="元组"></a>元组</h3><p>表示一组有序元素的集合。<br>一对花口号内,元素用逗号隔开。</p>
<blockquote>
<p>{1, 2}<br>{:ok, 42, “next”}<br>{:error, :enoent}</p>
</blockquote>
<h3 id="列表"><a href="#列表" class="headerlink" title="列表"></a>列表</h3><p>元组,更像是通常意义上的数组。<br>而列表是一种链式的数据结构,或者我们可以直接称之为链表。<br>列表适合线性遍历,随机访问会很费时。</p>
<p>列表有一些方便的运算符:</p>
<figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">iex> [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>] ++ [<span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>] <span class="comment">#链接</span></span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">6</span>]</span><br><span class="line">iex> [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>] -- [<span class="number">1</span>, <span class="number">2</span>] <span class="comment">#差集</span></span><br><span class="line">[<span class="number">3</span>]</span><br><span class="line">iex> <span class="number">1</span> <span class="keyword">in</span> [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>] <span class="comment">#属于</span></span><br><span class="line"><span class="keyword">true</span></span><br></pre></td></tr></table></figure>
<h3 id="关键字列表"><a href="#关键字列表" class="headerlink" title="关键字列表"></a>关键字列表</h3><p>因为我们常常需要一组键值对,<code>Elixir</code>提供了一种简写方式。</p>
<blockquote>
<p>[name: “Dave”, city: “Dallas”, age: “28”]</p>
</blockquote>
<p><code>Elixir</code>将其转换成一个由双值元组组成的列表:</p>
<blockquote>
<p>[{name: “Dave”}, {city: “Dallas”}, {age: “28”}]</p>
</blockquote>
<p>另,当关键字列表作为函数调用最后一个参数时,允许省略方括号。</p>
<blockquote>
<p>Db.save record, {name: “Dave”}, {city: “Dallas”}</p>
</blockquote>
<h3 id="散列表"><a href="#散列表" class="headerlink" title="散列表"></a>散列表</h3><p>一组键值对的集合,格式:</p>
<blockquote>
<p>%{key => value, key => value}</p>
</blockquote>
<p>为何既有散列表又有关键字列表呢。散列表的键 <strong>不能相同</strong>,而关键字列表允许存在重复的键。散列表更高效,尤其在数量不断增加的时候。</p>
<p>访问数据:<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> states = %{<span class="string">"AL"</span> => <span class="string">"Alabama"</span>, <span class="string">"WI"</span> => <span class="string">"Wisconsin"</span>}</span><br><span class="line">%{<span class="string">"AL"</span> => <span class="string">"Alabama"</span>, <span class="string">"WI"</span> => <span class="string">"Wisconsin"</span>}</span><br><span class="line">iex> states[<span class="string">"AL"</span>]</span><br><span class="line"><span class="string">"Alabama"</span></span><br></pre></td></tr></table></figure></p>
<p>如果是原子类型,可以使用点符号</p>
<blockquote>
<p>#:green<br>colors.green </p>
</blockquote>
<h3 id="二进制"><a href="#二进制" class="headerlink" title="二进制"></a>二进制</h3><p>有时候你需要访问你的数据是一个位,或者字节。<br>例如JPEG 和 MP3 文件头部包含一些字段,可能在单个字节内放置两到三个值。<br>二进制写法:<< 和 >> 之间。<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> bin = <<<span class="number">1</span>, <span class="number">2</span>>></span><br><span class="line"><<<span class="number">1</span>, <span class="number">2</span>>></span><br><span class="line">iex> byte_size bin</span><br><span class="line"><span class="number">2</span></span><br></pre></td></tr></table></figure></p>
<p>也可以通过修饰符控制类型和每个字段大小。<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> bin = <<<span class="number">3</span> <span class="symbol">:</span>: size(<span class="number">2</span>), <span class="number">5</span> <span class="symbol">:</span>: size(<span class="number">4</span>), <span class="number">1</span> <span class="symbol">:</span>: size(<span class="number">2</span>)>></span><br><span class="line"><<<span class="number">213</span>>></span><br><span class="line">iex> IO.format(<span class="string">"~-8.2b~n"</span>, <span class="symbol">:binary</span>.bin_to_list(bin))</span><br><span class="line"><span class="number">11010101</span></span><br></pre></td></tr></table></figure></p>
<h2 id="其他"><a href="#其他" class="headerlink" title="其他"></a>其他</h2><h3 id="真值"><a href="#真值" class="headerlink" title="真值"></a>真值</h3><p>true false nil 三个来表示。<br>true 等同于 :true</p>
<h3 id="运算符"><a href="#运算符" class="headerlink" title="运算符"></a>运算符</h3><p>例如:</p>
<blockquote>
<p>a === b #严格相等,1 === 1.0 为假<br>a !== b #严格不等, 1 !== 1.0 为真<br>a == b #值相等,1 == 1.0为真。<br>a != b #值不等,1 != 1.0 为假<br>a > b #正常比较<br>a >= b<br>a < b<br>a <= b</p>
</blockquote>
<h3 id="布尔运算符"><a href="#布尔运算符" class="headerlink" title="布尔运算符"></a>布尔运算符</h3><p>优先计算第一个参数的值。</p>
<blockquote>
<p>a <code>or</code> b # a 真则真,否则求b<br>a <code>and</code> b # a 假则假, 否则求b<br><code>not</code> a # a为真,则假,否则为真</p>
</blockquote>
<h3 id="松弛的布尔运算符"><a href="#松弛的布尔运算符" class="headerlink" title="松弛的布尔运算符"></a>松弛的布尔运算符</h3><p>接受任意类型的值,任何除了<code>nil</code>或者<code>false</code>的值都被解释成真。</p>
<blockquote>
<p>a || b # a真则为 a,否则为 b<br>a && b # a真则为 b,否则为 b<br>!a # a真则为 假,否则为 真</p>
</blockquote>
<h3 id="算数运算符"><a href="#算数运算符" class="headerlink" title="算数运算符"></a>算数运算符</h3><pre><code>+ - * / div rem
</code></pre><p>整数除法会返回浮点数结果,采用div(a,b)可以求得整数结果。</p>
<p><code>rem</code> 是求余运算,被当做函数来使用。rem(11, 3) => 2</p>
<h3 id="链接运算符"><a href="#链接运算符" class="headerlink" title="链接运算符"></a>链接运算符</h3><pre><code>binary1 <> binary2 #链接两个二进制
list1 ++ list2
list1 -- list2
</code></pre><h3 id="in-运算符"><a href="#in-运算符" class="headerlink" title="in 运算符"></a>in 运算符</h3><pre><code>a in enum #测试 a 是否在枚举中
</code></pre><h2 id="代码规范"><a href="#代码规范" class="headerlink" title="代码规范"></a>代码规范</h2><ol>
<li><code>Elixir</code>的标识符由大小写字母,数字和下划线组成,可以以问好或者感叹号结尾。</li>
<li>模块,记录,协议,行为的名称大写字母开头,并驼峰式命名。其他标识符以小写字母或者下划线开头,通常用下划线分隔单词。</li>
<li>源文件UTF-8编码,但是标识符智能 ASCII 字符。</li>
<li>习惯上,源文件采用两格缩进,空格而非制表符。</li>
<li>注释以符号 # 开始。</li>
<li>参考 <a href="https://github.com/niftyn8/elixir_style_guide" target="_blank" rel="external">编码规范</a></li>
</ol>
<p><code>Elixir</code>内置类型有:</p>
<ul>
<li>值类型<ul>
<li>任意大小的整数</li>
<li>浮点数</li>
<li>原子</li>
<li>区间</li>
<li>正则表达式</li>
</ul>
</li>
<li>系统类型<ul>
<li>PID和端口</li>
<li>引用</li>
</ul>
</li>
<li>集合类型<ul>
<li>元组</li>
<li>列表</li>
<li>散列表</li>
<li>二进制 </li>
</ul>
</li>
</ul>
<p><code>Elixir</code>里其实 <strong>函数</strong> 也是类型。<br>
Elixir-模式匹配与不可变性
http://gobue.com/2016/06/29/Elixir-模式匹配与不可变性/
2016-06-29T12:54:24.000Z
2016-06-29T12:56:30.738Z
<h2 id="模式匹配"><a href="#模式匹配" class="headerlink" title="模式匹配"></a>模式匹配</h2><h3 id="赋值并非如你所料"><a href="#赋值并非如你所料" class="headerlink" title="赋值并非如你所料"></a>赋值并非如你所料</h3><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> a = <span class="number">1</span></span><br><span class="line"><span class="number">1</span></span><br><span class="line">iex> a + <span class="number">3</span></span><br><span class="line"><span class="number">4</span></span><br></pre></td></tr></table></figure>
<p>看下以上代码,很简单吧?<br>把 1 赋值给 a,然后 a 加上 3 返回 4 。</p>
<p>但是在<code>Elixir</code>里面不是这样,等号更像一种 <strong>断言(assertion)</strong> ,如果可以找到一种方式让左边等于右边,则执行成功;在<code>Elixir</code>里面可以称之为匹配运算符 <code>match operator</code>,参考如下代码:<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">iex> a = <span class="number">1</span></span><br><span class="line"><span class="number">1</span></span><br><span class="line">iex> <span class="number">1</span> = a</span><br><span class="line"><span class="number">1</span></span><br><span class="line">iex> <span class="number">2</span> = a</span><br><span class="line">** (MatchError) no match of right hand side <span class="symbol">vlaue:</span> <span class="number">1</span></span><br></pre></td></tr></table></figure></p>
<a id="more"></a>
<p><strong>模式匹配</strong> 必须值与模式的结构相同,而且模式中项目与值中对应的项目都匹配时才算成功。<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">iex> list = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">iex> [a, <span class="number">2</span>, b] = list</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">iex> a</span><br><span class="line"><span class="number">1</span></span><br><span class="line">iex> b</span><br><span class="line"><span class="number">3</span></span><br></pre></td></tr></table></figure></p>
<p>下面匹配失败:<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> list = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">[<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">iex> [a, <span class="number">1</span>, b] = list</span><br><span class="line">**(MatchError) no match of right hand side <span class="symbol">vlaue:</span> [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br></pre></td></tr></table></figure></p>
<p>匹配过程中,变量一旦绑定某个值,在匹配其余部分的时候就会保持不变;如果想强制让已有的值参与匹配,用 <code>^</code>(脱字符)前缀。<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">iex> a = <span class="number">1</span></span><br><span class="line"><span class="number">1</span></span><br><span class="line">iex> a = <span class="number">2</span></span><br><span class="line"><span class="number">2</span></span><br><span class="line">iex> ^a = <span class="number">1</span></span><br><span class="line">** (MatchError) no match of right hand side <span class="symbol">vlaue:</span> <span class="number">1</span></span><br></pre></td></tr></table></figure></p>
<h2 id="不可变性"><a href="#不可变性" class="headerlink" title="不可变性"></a>不可变性</h2><p><code>Elixir</code>的数据一旦创建就不能被改变。</p>
<p><strong>在函数式语言里,我们总是转换数据,我们从不就地修改它。</strong></p>
<p>在大数据编程语言里,大多数复合类型是可变的,你可以修改它们的全部或者部分内容。这种情况当在并行的时候发生,那么受伤的总是你。例如Java中,由于可变性,多线程访问一个变量的时候我们总要考虑到共享变量的状态,然后通过锁等机制去保证数据准确性。</p>
<h3 id="不可变的数据才是已知的"><a href="#不可变的数据才是已知的" class="headerlink" title="不可变的数据才是已知的"></a>不可变的数据才是已知的</h3><p>“编程就是形式数据转换”。<br>比如当更新[1, 2, 3]时,我们不是在原址修改它,而是将它转换成新数据。</p>
<h3 id="复制数据"><a href="#复制数据" class="headerlink" title="复制数据"></a>复制数据</h3><p>凭借常识,大家会认为每次修改都要拷贝一份副本这种数据的复制是抵消的;但其实相反,<code>Elixir</code>知道已有数据是不可变的,所以当创建新的结构时,它可以重用这些数据的部分或者全部。<br>简而言之,不用考虑数据复制在<code>Elixir</code>中的效率问题。</p>
<h2 id="垃圾回收"><a href="#垃圾回收" class="headerlink" title="垃圾回收"></a>垃圾回收</h2><p><code>Elixir</code> 最酷的地方是可以在代码中使用许许多多的进程,而每个进程都有自己的堆,应用程序的数据都由这些进程分摊,跟所有把所有的数据放在一个堆里的情况相比,每个单独的堆是非常小的。<br>因此<code>Elixir</code>里面垃圾回收速度回更快。<br>当一个进程在其堆饱和前,终止时,它所有的数据都会被删除,没有必要进行垃圾回收。</p>
<h2 id="模式匹配"><a href="#模式匹配" class="headerlink" title="模式匹配"></a>模式匹配</h2><h3 id="赋值并非如你所料"><a href="#赋值并非如你所料" class="headerlink" title="赋值并非如你所料"></a>赋值并非如你所料</h3><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">iex> a = <span class="number">1</span></span><br><span class="line"><span class="number">1</span></span><br><span class="line">iex> a + <span class="number">3</span></span><br><span class="line"><span class="number">4</span></span><br></pre></td></tr></table></figure>
<p>看下以上代码,很简单吧?<br>把 1 赋值给 a,然后 a 加上 3 返回 4 。</p>
<p>但是在<code>Elixir</code>里面不是这样,等号更像一种 <strong>断言(assertion)</strong> ,如果可以找到一种方式让左边等于右边,则执行成功;在<code>Elixir</code>里面可以称之为匹配运算符 <code>match operator</code>,参考如下代码:<br><figure class="highlight elixir"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">iex> a = <span class="number">1</span></span><br><span class="line"><span class="number">1</span></span><br><span class="line">iex> <span class="number">1</span> = a</span><br><span class="line"><span class="number">1</span></span><br><span class="line">iex> <span class="number">2</span> = a</span><br><span class="line">** (MatchError) no match of right hand side <span class="symbol">vlaue:</span> <span class="number">1</span></span><br></pre></td></tr></table></figure></p>
学一门未来的语言Elixir
http://gobue.com/2016/06/25/学一门未来的语言Elixir/
2016-06-25T15:58:15.000Z
2016-06-29T13:02:02.177Z
<blockquote class="blockquote-center"><p>“不要咖啡,不要大象,不要蟒蛇,不要红宝石,只要万金油。”</p>
</blockquote>
<h2 id="Elixir"><a href="#Elixir" class="headerlink" title="Elixir"></a>Elixir</h2><p><code>Elixir</code>,美式发音是[ɪˈlɪksɚ],翻译过来炼金药,长生不老药,万金油这个名字不错,我喜欢。</p>
<h2 id="是什么?"><a href="#是什么?" class="headerlink" title="是什么?"></a>是什么?</h2><p>一种函数式编程语言,运行在工业级、高性能、分数式的Erlang虚拟机上。<code>Elixir</code>继承了<code>Erlang</code>在构建分布式系统上优点,并且通过添加众多现代化的编程语言的特性来提升语言表达能力。与Java等面向对象的编程语言不同,<code>Elixir</code>是面向并发的编程语言。</p>
<h2 id="下载安装"><a href="#下载安装" class="headerlink" title="下载安装"></a>下载安装</h2><p>Installer <a href="http://elixir-lang.org/getting-started/introduction.html#installation" target="_blank" rel="external">Download</a><br><a id="more"></a></p>
<h2 id="为什么学?"><a href="#为什么学?" class="headerlink" title="为什么学?"></a>为什么学?</h2><p>随着移动互联网,物联网的发展,摩尔定律的失效,充分利用计算器内核完成高并发任务将会是未来开发主流。代码世界不局限于现在,有时间可以学习学习一门未来的编程语言。鉴于<code>Erlang</code>在<code>WhatsApp</code>上的表现,个人觉得<code>Elixir</code>很不错。</p>
<h2 id="换一种方式思考"><a href="#换一种方式思考" class="headerlink" title="换一种方式思考"></a>换一种方式思考</h2><ol><br> <li>面向对象不是设计代码的唯一方法。</li><br> <li>函数式编程不一定是复杂和纯数学的。</li><br> <li>编程的基础不是赋值、if语句和循环。</li><br> <li>并发不一定需要锁、信号量、监视器等类似的东西。</li><br> <li>进程不必消耗大量的资源。</li><br> <li>元编程不只是语言的附属品。</li><br></ol>
<h2 id="关于此文"><a href="#关于此文" class="headerlink" title="关于此文"></a>关于此文</h2><p>连载仅作《Programming Elixir》一书的笔记型记录。</p>
<blockquote class="blockquote-center"><p>“不要咖啡,不要大象,不要蟒蛇,不要红宝石,只要万金油。”</p>
</blockquote>
<h2 id="Elixir"><a href="#Elixir" class="headerlink" title="Elixir"></a>Elixir</h2><p><code>Elixir</code>,美式发音是[ɪˈlɪksɚ],翻译过来炼金药,长生不老药,万金油这个名字不错,我喜欢。</p>
<h2 id="是什么?"><a href="#是什么?" class="headerlink" title="是什么?"></a>是什么?</h2><p>一种函数式编程语言,运行在工业级、高性能、分数式的Erlang虚拟机上。<code>Elixir</code>继承了<code>Erlang</code>在构建分布式系统上优点,并且通过添加众多现代化的编程语言的特性来提升语言表达能力。与Java等面向对象的编程语言不同,<code>Elixir</code>是面向并发的编程语言。</p>
<h2 id="下载安装"><a href="#下载安装" class="headerlink" title="下载安装"></a>下载安装</h2><p>Installer <a href="http://elixir-lang.org/getting-started/introduction.html#installation">Download</a><br>
MarkdownPad工具写GitHub博客
http://gobue.com/2016/06/23/MarkdownPad工具写GitHub博客/
2016-06-23T13:50:06.000Z
2016-06-23T14:27:44.991Z
<blockquote class="blockquote-center"><p>用markdown写博客纯文本编辑也不是很方便,可以利用<code>MarkdownPad</code>进行可视化编辑。</p>
</blockquote>
<h2 id="版本下载"><a href="#版本下载" class="headerlink" title="版本下载"></a>版本下载</h2><p>Markdownpad2 <a href="http://markdownpad.com/" target="_blank" rel="external">download</a><br>直接官网下载免费版本。</p>
<img src="http://markdownpad.com/img/markdownpad2.png" class="full-image" alt="MarkdownPad 2" title="MarkdownPad 2">
<a id="more"></a>
<h2 id="Pro-激活"><a href="#Pro-激活" class="headerlink" title="Pro 激活"></a>Pro 激活</h2><p>pro版本功能会更加丰富,还是升级Pro吧,下面给个目前可用的注册码。</p>
<pre>
邮箱:
Soar360@live.com
授权秘钥:
GBPduHjWfJU1mZqcPM3BikjYKF6xKhlKIys3i1MU2eJHqWGImDHzWdD6xhMNLGVpbP2M5SN6bnxn2kSE8qHqNY5QaaRxmO3YSMHxlv2EYpjdwLcPwfeTG7kUdnhKE0vVy4RidP6Y2wZ0q74f47fzsZo45JE2hfQBFi2O9Jldjp1mW8HUpTtLA2a5/sQytXJUQl/QKO0jUQY4pa5CCx20sV1ClOTZtAGngSOJtIOFXK599sBr5aIEFyH0K7H4BoNMiiDMnxt1rD8Vb/ikJdhGMMQr0R4B+L3nWU97eaVPTRKfWGDE8/eAgKzpGwrQQoDh+nzX1xoVQ8NAuH+s4UcSeQ==
</pre>
<p>网上也有绿色版本,可利用网盘搜索查找资源。</p>
<h2 id="Github-版的高亮"><a href="#Github-版的高亮" class="headerlink" title="Github 版的高亮"></a>Github 版的高亮</h2><p>MarkdownPad默认的Processor和Github的还不太一样,</p>
<pre><code class="html"><span class="tag"><<span class="name">h2</span>></span>Html语言<span class="tag"></<span class="name">h2</span>></span>
</code></pre>
<p>Github 风格的代码高亮,支持按照编程语言进行高亮显示,所以咱们需要设置下Processor。</p>
<ol><br><li><code>Tools</code> -> <code>Options</code> (工具 -> 选项)</li><br><li>左侧栏选择 <code>Markdown</code></li><br><li><code>Markdown Processor</code>下拉选择, <code>GitHub Flavored Markdown</code></li><br><li><code>Save and Close</code></li><br></ol>
<p>支持如下写法:</p>
<pre>
```html
</pre>
<blockquote class="blockquote-center"><p>用markdown写博客纯文本编辑也不是很方便,可以利用<code>MarkdownPad</code>进行可视化编辑。</p>
</blockquote>
<h2 id="版本下载"><a href="#版本下载" class="headerlink" title="版本下载"></a>版本下载</h2><p>Markdownpad2 <a href="http://markdownpad.com/">download</a><br>直接官网下载免费版本。</p>
<img src="http://markdownpad.com/img/markdownpad2.png" class="full-image" alt="MarkdownPad 2" title="MarkdownPad 2" />
用markdown的语法写博客
http://gobue.com/2016/06/19/用markdown的语法写博客/
2016-06-19T13:31:06.000Z
2016-06-23T14:01:55.759Z
<blockquote class="blockquote-center"><p>Markdown语法和Next主题写博客</p>
</blockquote>
<h2 id="文本居中"><a href="#文本居中" class="headerlink" title="文本居中"></a>文本居中</h2><p>此标签将生成一个带上下分割线的引用,同时引用内文本将自动居中。 文本居中时,多行文本若长度不等,视觉上会显得不对称,因此建议在引用单行文本的场景下使用。<br><blockquote class="blockquote-center"><p>例如作为文章开篇引用 或者 结束语之前的总结引用。</p>
</blockquote><br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!-- HTML方式: 直接在 Markdown 文件中编写 HTML 来调用 --></span></span><br><span class="line"><span class="comment"><!-- 其中 class="blockquote-center" 是必须的 --></span></span><br><span class="line"> <span class="tag"><<span class="name">blockquote</span> <span class="attr">class</span>=<span class="string">"blockquote-center"</span>></span>blah blah blah<span class="tag"></<span class="name">blockquote</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 标签 方式,要求版本在0.4.5或以上 --></span></span><br><span class="line">{% centerquote %}blah blah blah{% endcenterquote %}</span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 标签别名 --></span></span><br><span class="line">{% cq %} blah blah blah {% endcq %}</span><br><span class="line">`</span><br></pre></td></tr></table></figure></p>
<a id="more"></a>
<h2 id="Next的图片方式"><a href="#Next的图片方式" class="headerlink" title="Next的图片方式"></a>Next的图片方式</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!-- HTML方式: 直接在 Markdown 文件中编写 HTML 来调用 --></span></span><br><span class="line"><span class="comment"><!-- 其中 class="full-image" 是必须的 --></span></span><br><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">"/image-url"</span> <span class="attr">class</span>=<span class="string">"full-image"</span> /></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 标签 方式,要求版本在0.4.5或以上 --></span></span><br><span class="line">{% fullimage /image-url, alt, title %}</span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- 别名 --></span></span><br><span class="line">{% fi /image-url, alt, title %}</span><br></pre></td></tr></table></figure>
<img src="http://news.likeiii.com/uploadfile/2014/0311/20140311094802333.jpg" class="full-image" alt="teddy是只猫" title="teddy是只猫">
<figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">src</span>=<span class="string">"http://news.likeiii.com/uploadfile/2014/0311/20140311094802333.jpg"</span> <span class="attr">border</span>=<span class="string">"0"</span>></span></span><br></pre></td></tr></table></figure>
<h2 id="table标签"><a href="#table标签" class="headerlink" title="table标签"></a>table标签</h2><table><br> <tr><br> <td>Foo</td><br> </tr><br></table>
<h2 id="符号转换"><a href="#符号转换" class="headerlink" title="符号转换"></a>符号转换</h2><p>在 HTML 文件中,有两个字符需要特殊处理: < 和 & 。 < 符号用于起始标签,& 符号则用于标记 HTML 实体,如果你只是想要显示这些字符的原型,你必须要使用实体的形式,像是 < 和 &。</p>
<h2 id="字体强调"><a href="#字体强调" class="headerlink" title="字体强调"></a>字体强调</h2><pre>
*斜体强调*
**粗体强调**
</pre>
<h2 id="标题"><a href="#标题" class="headerlink" title="标题"></a>标题</h2><p>Markdown 支持两种标题的语法,类 Setext 和类 atx 形式。<br>类 Setext 形式是用底线的形式,利用 = (最高阶标题)和 - (第二阶标题),例如:</p>
<h2 id="区块引用-Blockquotes"><a href="#区块引用-Blockquotes" class="headerlink" title="区块引用 Blockquotes"></a>区块引用 Blockquotes</h2><blockquote>
<p>Markdown 标记区块引用是使用类似 email 中用 > 的引用方式。<br>如果你还熟悉在 email 信件中的引言部分,你就知道怎么在 Markdown 文件中建立一个区块引用<br>那会看起来像是你自己先断好行,然后在每行的最前面加上 > :</p>
</blockquote>
<h2 id="有序列表"><a href="#有序列表" class="headerlink" title="有序列表"></a>有序列表</h2><ol><br> <li>Bird</li><br> <li>McHale</li><br> <li>Parish</li><br></ol>
<h2 id="代码"><a href="#代码" class="headerlink" title="代码"></a>代码</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag"><<span class="name">ol</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>Bird<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>McHale<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"><<span class="name">li</span>></span>Parish<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"><span class="tag"></<span class="name">ol</span>></span></span><br></pre></td></tr></table></figure>
<blockquote class="blockquote-center"><p>Markdown语法和Next主题写博客</p>
</blockquote>
<h2 id="文本居中"><a href="#文本居中" class="headerlink" title="文本居中"></a>文本居中</h2><p>此标签将生成一个带上下分割线的引用,同时引用内文本将自动居中。 文本居中时,多行文本若长度不等,视觉上会显得不对称,因此建议在引用单行文本的场景下使用。<br><blockquote class="blockquote-center"><p>例如作为文章开篇引用 或者 结束语之前的总结引用。</p>
</blockquote><br><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"><!-- HTML方式: 直接在 Markdown 文件中编写 HTML 来调用 --></span></span><br><span class="line"><span class="comment"><!-- 其中 class="blockquote-center" 是必须的 --></span></span><br><span class="line"> <span class="tag"><<span class="name">blockquote</span> <span class="attr">class</span>=<span class="string">"blockquote-center"</span>></span>blah blah blah<span class="tag"></<span class="name">blockquote</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 标签 方式,要求版本在0.4.5或以上 --></span></span><br><span class="line">{% centerquote %}blah blah blah{% endcenterquote %}</span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 标签别名 --></span></span><br><span class="line">{% cq %} blah blah blah {% endcq %}</span><br><span class="line">`</span><br></pre></td></tr></table></figure></p>
Hello World
http://gobue.com/2016/06/19/hello-world/
2016-06-19T01:02:18.132Z
2016-06-22T12:46:44.988Z
<p>Welcome to <a href="https://hexo.io/" target="_blank" rel="external">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/" target="_blank" rel="external">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html" target="_blank" rel="external">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues" target="_blank" rel="external">GitHub</a>.<br><a id="more"></a></p>
<h2 id="Quick-Start"><a href="#Quick-Start" class="headerlink" title="Quick Start"></a>Quick Start</h2><h3 id="Create-a-new-post"><a href="#Create-a-new-post" class="headerlink" title="Create a new post"></a>Create a new post</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/writing.html" target="_blank" rel="external">Writing</a></p>
<h3 id="Run-server"><a href="#Run-server" class="headerlink" title="Run server"></a>Run server</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo server</span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/server.html" target="_blank" rel="external">Server</a></p>
<h3 id="Generate-static-files"><a href="#Generate-static-files" class="headerlink" title="Generate static files"></a>Generate static files</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo generate</span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/generating.html" target="_blank" rel="external">Generating</a></p>
<h3 id="Deploy-to-remote-sites"><a href="#Deploy-to-remote-sites" class="headerlink" title="Deploy to remote sites"></a>Deploy to remote sites</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">$ hexo deploy</span><br></pre></td></tr></table></figure>
<p>More info: <a href="https://hexo.io/docs/deployment.html" target="_blank" rel="external">Deployment</a></p>
<p>Welcome to <a href="https://hexo.io/">Hexo</a>! This is your very first post. Check <a href="https://hexo.io/docs/">documentation</a> for more info. If you get any problems when using Hexo, you can find the answer in <a href="https://hexo.io/docs/troubleshooting.html">troubleshooting</a> or you can ask me on <a href="https://github.com/hexojs/hexo/issues">GitHub</a>.<br>