<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>springwq (Steven Wu)</title>
    <link>https://ruby-china.org/springwq</link>
    <description>初级 Rails 程序员</description>
    <language>en-us</language>
    <item>
      <title>RubyConf 2018 参会记录</title>
      <description>&lt;p&gt;RubyConf 2018, 将于下周在洛杉矶举行，有关注的吗？&lt;/p&gt;

&lt;p&gt;&lt;a href="https://rubyconf.org" rel="nofollow" target="_blank"&gt;https://rubyconf.org&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Day 0 - 11/12 大会现场初探"&gt;Day 0 - 11/12 大会现场初探&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/45f4aa1a-e6d4-498d-88f1-83b2882f7f8e.jpeg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/e29c0edd-655d-4133-a2a8-c5d56eee3c1c.jpeg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/375437d5-8228-4c56-a131-03557c941237.jpeg!large" title="" alt=""&gt;&lt;/p&gt;
&lt;h3 id="直播看 Matz 的 Opening Keynote"&gt;直播看 Matz 的 Opening Keynote&lt;/h3&gt;
&lt;p&gt;有两个会场会有直播&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;a href="https://confreaks.tv/events/rubyconfbiltmorebowl2018" rel="nofollow" target="_blank"&gt;https://confreaks.tv/events/rubyconfbiltmorebowl2018&lt;/a&gt; (有 Matz 的 Openning Keynote)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://confreaks.tv/events/rubyconfcrystalballroom2018" rel="nofollow" target="_blank"&gt;https://confreaks.tv/events/rubyconfcrystalballroom2018&lt;/a&gt; &lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="Day 1 - 11/13"&gt;Day 1 - 11/13&lt;/h2&gt;
&lt;p&gt;注册，然后领取了狗牌&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/c997424b-3418-45e9-a1df-253490fe523e.jpeg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2018/0ab5a6ec-75c1-4cad-aa72-c7775776978a.jpeg!large" title="" alt=""&gt;&lt;/p&gt;

&lt;p&gt;Meet Matz&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2018/412233b9-f660-429b-8e46-32d1c93dcd2e.jpeg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2018/a3763035-937b-4393-8c13-52a55905de76.jpeg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2018/d8ebfb19-7774-4595-b657-f15d0d64f806.jpeg!large" title="" alt=""&gt;
&lt;img src="https://l.ruby-china.com/photo/2018/dccf7331-5215-488f-a845-05eb212ab8bb.jpeg!large" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Fri, 09 Nov 2018 19:20:39 +0800</pubDate>
      <link>https://ruby-china.org/topics/37748</link>
      <guid>https://ruby-china.org/topics/37748</guid>
    </item>
    <item>
      <title>Rails 5.2.0 Released</title>
      <description>&lt;p&gt;&lt;a href="http://weblog.rubyonrails.org/2018/4/9/Rails-5-2-0-final/" rel="nofollow" target="_blank"&gt;http://weblog.rubyonrails.org/2018/4/9/Rails-5-2-0-final/&lt;/a&gt;&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Tue, 10 Apr 2018 10:50:53 +0800</pubDate>
      <link>https://ruby-china.org/topics/35415</link>
      <guid>https://ruby-china.org/topics/35415</guid>
    </item>
    <item>
      <title>Bootstrap 4.0 终于去掉 beta 了</title>
      <description>&lt;p&gt;&lt;a href="https://github.com/twbs/bootstrap-rubygem/tree/v4.0.0" rel="nofollow" target="_blank"&gt;https://github.com/twbs/bootstrap-rubygem/tree/v4.0.0&lt;/a&gt;&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Sat, 20 Jan 2018 14:20:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/34927</link>
      <guid>https://ruby-china.org/topics/34927</guid>
    </item>
    <item>
      <title>转赠 RubyConf China 2016 早鸟票一张</title>
      <description>&lt;p&gt;因故无法参加本届大会，转赠我的一张早鸟票，有缘人，请留邮箱地址。&lt;/p&gt;

&lt;p&gt;在此，预祝本届大会圆满成功，并希望下一届大会能回到华东地区（上海，杭州，南京是极好的）。&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Tue, 20 Sep 2016 01:30:58 +0800</pubDate>
      <link>https://ruby-china.org/topics/31099</link>
      <guid>https://ruby-china.org/topics/31099</guid>
    </item>
    <item>
      <title>青轴，茶轴还是红轴， 哪个更适合敲代码？</title>
      <description>&lt;p&gt;之前一直在用 Apple Magic Keyboard,  最近突然有几个键不灵了，想换键盘。自己有一个 最便宜的 Cherry 黑轴用来玩游戏的，现在在敲代码，但是感觉打字有点累，有时要用力才能按下去。&lt;/p&gt;

&lt;p&gt;现在看了下准备入手 Filco Minila Air 67, 身在小城市，家附近也没有能体验的实体店，请问一下：青轴，茶轴和红轴哪个更适合敲代码呢？ &lt;/p&gt;
&lt;h4 id="Updates"&gt;Updates&lt;/h4&gt;
&lt;p&gt;谢谢大家的建议，已经入手 Filco Minila Air 67 白色 茶轴了。&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Mon, 11 Jul 2016 13:16:28 +0800</pubDate>
      <link>https://ruby-china.org/topics/30496</link>
      <guid>https://ruby-china.org/topics/30496</guid>
    </item>
    <item>
      <title>推荐一个 Rails 5 Tips 的博客</title>
      <description>&lt;p&gt;最近在用 Rails 5 写一个新项目，由于 &lt;a href="http://blog.bigbinary.com/2016/02/15/rails-5-makes-belong-to-association-required-by-default.html" rel="nofollow" target="_blank" title=""&gt; Rails 5 makes belongs_to association required by default&lt;/a&gt;,  我在实现一个 self-referrence 的 model 出现了点问题。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Category&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationRecord&lt;/span&gt;
  &lt;span class="n"&gt;has_many&lt;/span&gt; &lt;span class="ss"&gt;:child_categories&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;class_name: &lt;/span&gt;&lt;span class="s2"&gt;"Category"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;foreign_key: &lt;/span&gt;&lt;span class="s2"&gt;"parent_id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;dependent: :delete_all&lt;/span&gt;
  &lt;span class="n"&gt;belongs_to&lt;/span&gt; &lt;span class="ss"&gt;:parent_categories&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;class_name: &lt;/span&gt;&lt;span class="s2"&gt;"Category"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;foreign_key: &lt;/span&gt;&lt;span class="s2"&gt;"parent_id"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;虽然可以在 config 里关闭这个特性，但还是希望希望保持这个特性将来可以少写一点 validation，于是我把 &lt;code&gt;belongs_to&lt;/code&gt; 关联去掉了。。。&lt;/p&gt;

&lt;p&gt;Google 搜到这个&lt;a href="http://blog.bigbinary.com/categories/Rails%205" rel="nofollow" target="_blank" title=""&gt;博客&lt;/a&gt;，挺有料的，第一篇 Rails 5 相关的博客，从 2015 年 10 月份就开始了。&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2016/90030eeada00c19c3ba1d5ca5e5b4ce0.png" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Thu, 14 Apr 2016 19:08:05 +0800</pubDate>
      <link>https://ruby-china.org/topics/29714</link>
      <guid>https://ruby-china.org/topics/29714</guid>
    </item>
    <item>
      <title>如何在用户注册表单获取 text_field value 并通过参数传到 controller 中</title>
      <description>&lt;p&gt;目前的项目有这样的需求，在用户的注册表单界面，需要用户输入手机验证码，然后才能注册成功。&lt;/p&gt;

&lt;p&gt;怎样才能在不提交 form 的情况下，把 用户填写的手机号码获取到，然后传递到 Users#send_sms action 中呢？&lt;/p&gt;

&lt;p&gt;在这个注册页面，可以通过 &lt;code&gt;$("#phone_number").val()&lt;/code&gt; 获取到手机号，但是不知道怎么才能把这个值传递到 参数中，比如： &lt;code&gt;params.merge(phone_number: phone_number)&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsersController&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;ApplicationController&lt;/span&gt;
  &lt;span class="c1"&gt;# 发送验证码短信到用户手机，需要提供手机号码&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;send_sms&lt;/span&gt;
     &lt;span class="n"&gt;phone_number&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注册表单：&lt;/p&gt;
&lt;pre class="highlight erb"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;form_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;url: &lt;/span&gt;&lt;span class="n"&gt;users_path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;text_field&lt;/span&gt; &lt;span class="ss"&gt;:phone_number&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;placeholder: &lt;/span&gt;&lt;span class="s2"&gt;"手机号"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;autofocus: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;id: &lt;/span&gt;&lt;span class="s2"&gt;"phone_number"&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="na"&gt;placeholder=&lt;/span&gt;&lt;span class="s"&gt;"验证码"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;link_to&lt;/span&gt; &lt;span class="n"&gt;send_sms_users_path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;method: :get&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="ss"&gt;:"send_sms"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="ss"&gt;remote: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;  &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;span&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"send_sms"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;获取验证码&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;password_field&lt;/span&gt; &lt;span class="ss"&gt;:password&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;placeholder: &lt;/span&gt;&lt;span class="s2"&gt;"密码"&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt; &lt;span class="s2"&gt;"注册"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;class: &lt;/span&gt;&lt;span class="s2"&gt;"button"&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="cp"&gt;&amp;lt;%&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>springwq</author>
      <pubDate>Thu, 07 Jan 2016 18:16:34 +0800</pubDate>
      <link>https://ruby-china.org/topics/28647</link>
      <guid>https://ruby-china.org/topics/28647</guid>
    </item>
    <item>
      <title>The Pragmatic Bookshelf 的优惠码又来了</title>
      <description>&lt;p&gt;感恩节要来了，今年 &lt;a href="https://pragprog.com/" rel="nofollow" target="_blank" title=""&gt;The Pragmatic Bookshelf&lt;/a&gt; 的优惠码又来了，40% off.&lt;/p&gt;

&lt;p&gt;Coupon code:  turkeysale2015&lt;/p&gt;

&lt;p&gt;截止日期：2015-12-1&lt;/p&gt;

&lt;p&gt;我买了一本 &lt;a href="https://pragprog.com/book/agcr/confident-ruby" rel="nofollow" target="_blank" title=""&gt;Confident Ruby&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;This is a book about Ruby, and about joy.&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>springwq</author>
      <pubDate>Tue, 24 Nov 2015 01:01:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/28170</link>
      <guid>https://ruby-china.org/topics/28170</guid>
    </item>
    <item>
      <title>Grape-Swagger UI 里面的 URL 后缀问题， hide_format 不工作</title>
      <description>&lt;p&gt;grape-swagger 生成的 API 文档是下面这样的：
&lt;img src="https://l.ruby-china.com/photo/2015/517d30c146bec31a3bfac00a83eaab3a.png" title="" alt=""&gt;
但是，如果我在这个页面发起 API 请求，一直有 路由报错&lt;/p&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ActionController::RoutingError &lt;span class="o"&gt;(&lt;/span&gt;No route matches &lt;span class="o"&gt;[&lt;/span&gt;POST] &lt;span class="s2"&gt;"/v1/user/signin(.json)"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;:
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我在想是不是因为 URL 后面有&lt;code&gt;(.json)&lt;/code&gt; 缘故，查看 grape-swagger 文档有  &lt;code&gt;hide_format&lt;/code&gt; 参数，但是配置后，还是有 .json 后缀。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;add_swagger_documentation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="ss"&gt;:api_version&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;"v1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;hide_documentation_path: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;hide_format: &lt;/span&gt;&lt;span class="kp"&gt;true&lt;/span&gt;
 &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;另外，如果 用 Postman 测试，API 一切正常。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;发现是版本问题，用 v0.10.2 就好了。 &lt;code&gt;'grape-swagger', '~&amp;gt; 0.10.2'&lt;/code&gt;&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Fri, 16 Oct 2015 11:01:19 +0800</pubDate>
      <link>https://ruby-china.org/topics/27694</link>
      <guid>https://ruby-china.org/topics/27694</guid>
    </item>
    <item>
      <title>如何在 View 里面安全的解析 markdown</title>
      <description>&lt;p&gt;在 view 里面，我是这样解析 markdown 的：&lt;/p&gt;
&lt;pre class="highlight erb"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
  &lt;span class="cp"&gt;&amp;lt;%=&lt;/span&gt; &lt;span class="n"&gt;render_markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;post&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;description&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;html_safe&lt;/span&gt; &lt;span class="cp"&gt;%&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;render_markdown&lt;/code&gt; 是一个 helper method&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;render_markdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="no"&gt;Redcarpet&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Markdown&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Redcarpet&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Render&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;HTML&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;render&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但是，post.description 里面有用户输入的任何数据，如果用了 &lt;code&gt;html_safe&lt;/code&gt; 是不是有安全隐患？如何较安全的解析 Markdown 呢。&lt;/p&gt;

&lt;p&gt;P.S. 看了 RubyChina 的源码，但是没看懂。。。。&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Sun, 07 Jun 2015 23:33:20 +0800</pubDate>
      <link>https://ruby-china.org/topics/25918</link>
      <guid>https://ruby-china.org/topics/25918</guid>
    </item>
    <item>
      <title>Ruby 中的 Block 和 Iterator </title>
      <description>&lt;p&gt;P.S. 本文我读 Programming Ruby 的读书笔记。&lt;/p&gt;

&lt;p&gt;&lt;a href="http://segmentfault.com/a/1190000002705875" rel="nofollow" target="_blank"&gt;http://segmentfault.com/a/1190000002705875&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="Block"&gt;Block&lt;/h2&gt;&lt;h3 id="定义"&gt;定义&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;some_array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;other_array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;A block is somewhat like the body of an anonymous method&lt;/li&gt;
&lt;li&gt;Block can take parameters&lt;/li&gt;
&lt;li&gt;Block 只有被 method 调用时才会起作用，如果 method 中有参数，block 出现在最后面&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="Block 中的变量"&gt;Block 中的变量&lt;/h3&gt;&lt;h4 id="如果 block 的本地变量的名字和 block 之外但是在同样 scope 里面的 变量名字一样，那他们两个是一样的。block 内变量的值会改变 block 外变量的值。"&gt;如果 block 的本地变量的名字和 block 之外但是在同样 scope 里面的 变量名字一样，那他们两个是一样的。block 内变量的值会改变 block 外变量的值。&lt;/h4&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; 30&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="如果 block 中的变量只出现在 block 中，那么它只是 block 中本地变量，无法在 block 之外被引用。"&gt;如果 block 中的变量只出现在 block 中，那么它只是 block 中本地变量，无法在 block 之外被引用。&lt;/h4&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
  &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; 30&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="c1"&gt;# undefined local variable or method 'square' for main:Object &amp;lt;NameError&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="Parameters to a block are always local to a block, even if they have the same name as locals in the surrounding scope."&gt;Parameters to a block are always local to a block, even if they have the same name as locals in the surrounding scope.&lt;/h4&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;  &lt;span class="s2"&gt;"some shape"&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;

&lt;span class="c1"&gt;# 1&lt;/span&gt;
&lt;span class="c1"&gt;# 2&lt;/span&gt;
&lt;span class="c1"&gt;# some shape&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="You can define a block-local variables by putting them after s semicolon in the block's parameter list"&gt;You can define a block-local variables by putting them after s semicolon in the block's parameter list&lt;/h4&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"some shape"&lt;/span&gt;
&lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;
    &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="c1"&gt;# 30&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;square&lt;/span&gt; &lt;span class="c1"&gt;# some shape&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;By making square block-local, values assigned inside the block will not affect the value of the variable with the same name in the outer scope.&lt;/p&gt;
&lt;h2 id="Iterator"&gt;Iterator&lt;/h2&gt;&lt;h3 id="定义"&gt;定义&lt;/h3&gt;
&lt;p&gt;A Ruby iterator is simple a method that can invoke a block of code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;Block 一般是跟着 method 出现的，并且 block 中的代码不一定会执行&lt;/li&gt;
&lt;li&gt;如果 method 中有 &lt;code&gt;yield&lt;/code&gt;, 那么它的 block 中的代码会被执行&lt;/li&gt;
&lt;li&gt;Block 可以接收参数，和返回 value&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;two_times&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;two_times&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"Hello"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;# Hello&lt;/span&gt;
&lt;span class="c1"&gt;# Hello&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;fib_up_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
  &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;i1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;
      &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;i1&lt;/span&gt;
      &lt;span class="n"&gt;i1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;i2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;i2&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;fib_up_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;" "&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;上面代码中的 yield 之后的 &lt;code&gt;i1&lt;/code&gt; 会作为 parameter 传入到 block 中，赋值给 block 的 argument &lt;code&gt;f&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;Block 中可以有多个 arguments.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="常见的 iterator"&gt;常见的 iterator&lt;/h3&gt;&lt;h4 id="each"&gt;each&lt;/h4&gt;
&lt;p&gt;each is probable the simplest iterator - all it does is yield successive elements of its collection.&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 1 &lt;/span&gt;
&lt;span class="c1"&gt;# 3&lt;/span&gt;
&lt;span class="c1"&gt;# 5&lt;/span&gt;
&lt;span class="c1"&gt;# 7&lt;/span&gt;
&lt;span class="c1"&gt;# 9&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="find"&gt;find&lt;/h4&gt;
&lt;p&gt;A blocl may also return a value to the method. The value of the last expression evaluated in the block is passed back to the method as the value of the yield.&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Array&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;find&lt;/span&gt;
    &lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="k"&gt;yield&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="no"&gt;V&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="no"&gt;V&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h4 id="collect (also known as map)"&gt;collect (also known as map)&lt;/h4&gt;
&lt;p&gt;Which takes each element from the collection and passes it to the block. The results returned by the block are used to construct a new array&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"H"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"A"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"L"&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;succ&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; ["I", "B", "M"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="inject"&gt;inject&lt;/h3&gt;
&lt;p&gt;The inject method lets you accumulate a value across the members of a collection.&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;inject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 16&lt;/span&gt;

&lt;span class="c1"&gt;# sum = 1, element = 3&lt;/span&gt;
&lt;span class="c1"&gt;# sum = 4, element = 5&lt;/span&gt;
&lt;span class="c1"&gt;# sum = 9, element = 7&lt;/span&gt;
&lt;span class="c1"&gt;# sum = 16&lt;/span&gt;

&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;inject&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;element&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;product&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;element&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 105&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;If &lt;code&gt;inject&lt;/code&gt; is called with no parameter, it uses the first element of the collections as the initial value and starts the iteration with the second value.&lt;/p&gt;

&lt;p&gt;上面代码的另一种简便写法：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;].&lt;/span&gt;&lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 16&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(:&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 105&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="Iterator 和 I/O 系统的交互"&gt;Iterator 和 I/O 系统的交互&lt;/h3&gt;
&lt;p&gt;Iterators 不仅仅能够访问 Array 和 Hash 中的数据，和可以和 I/O 系统交互&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"testfile"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
  &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"The line is: &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;

&lt;span class="ss"&gt;produces:
&lt;/span&gt;&lt;span class="no"&gt;The&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ss"&gt;is: &lt;/span&gt;&lt;span class="no"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;one&lt;/span&gt;
&lt;span class="no"&gt;The&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ss"&gt;is: &lt;/span&gt;&lt;span class="no"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;two&lt;/span&gt;
&lt;span class="no"&gt;The&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="ss"&gt;is: &lt;/span&gt;&lt;span class="no"&gt;This&lt;/span&gt; &lt;span class="n"&gt;is&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;three&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="Parameter 和 Argument"&gt;Parameter 和 Argument&lt;/h2&gt;
&lt;p&gt;目前，我的理解是 Parameter 是实际参数，而 Argument 是形式参数&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Mon, 27 Apr 2015 20:55:07 +0800</pubDate>
      <link>https://ruby-china.org/topics/25343</link>
      <guid>https://ruby-china.org/topics/25343</guid>
    </item>
    <item>
      <title>[已解决] 在 Pry 里面设置默认编辑器为 Sublime Text 3 失败</title>
      <description>&lt;p&gt;最近 在学习使用 Pry, 文档里只说了如何设置 emacs 为 默认编辑器，由于我的系统了装了 vim, 现在在 pry 里面的默认 编辑器是 vim。
Google 了一些方法，想设置成 Sublime Text 3, 但是没有成功。&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Sat, 11 Apr 2015 11:37:57 +0800</pubDate>
      <link>https://ruby-china.org/topics/25096</link>
      <guid>https://ruby-china.org/topics/25096</guid>
    </item>
    <item>
      <title>【已发完】分享 10 个 Inbox 邀请码</title>
      <description>&lt;p&gt;这边有人想玩 Inbox 吗？我这边可以邀请十个。&lt;/p&gt;

&lt;p&gt;请留下 Gmail 地址，或发邮件给我 wuqi0509 AT gmail.com&lt;/p&gt;

&lt;p&gt;P.S. 有两位同学用 163 和 QQ 邮箱发邮件给我，这里说明一下，Inbox by Gamil 是 基于 Gmail 的，不知道你们能不能用。&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Mon, 30 Mar 2015 11:33:12 +0800</pubDate>
      <link>https://ruby-china.org/topics/24907</link>
      <guid>https://ruby-china.org/topics/24907</guid>
    </item>
    <item>
      <title>Sublime Text 如何在测试文件和被测试文件之间跳转</title>
      <description>&lt;p&gt;ST3 是否有快捷方式能够在测设文件和被测试文件之间来回跳转呢，像 Rails.vim 一样？&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Fri, 27 Mar 2015 00:21:47 +0800</pubDate>
      <link>https://ruby-china.org/topics/24854</link>
      <guid>https://ruby-china.org/topics/24854</guid>
    </item>
    <item>
      <title>极客学院的课程挺好的</title>
      <description>&lt;p&gt;这个 Bootstrap 课程，码农周刊推荐了。
&lt;a href="http://www.jikexueyuan.com/path/bootstrap/" rel="nofollow" target="_blank"&gt;http://www.jikexueyuan.com/path/bootstrap/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;下面这是讲 Grape 的不知道是不是社区的？&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.jikexueyuan.com/course/628.html" rel="nofollow" target="_blank"&gt;http://www.jikexueyuan.com/course/628.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;里面也有 iOS 的课程。&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Fri, 20 Mar 2015 21:35:17 +0800</pubDate>
      <link>https://ruby-china.org/topics/24758</link>
      <guid>https://ruby-china.org/topics/24758</guid>
    </item>
    <item>
      <title>Sublime Text 如何设置缩进</title>
      <description>&lt;p&gt;刚刚开始用 Sublime Text 3, 如何设置缩进呢？比如 Ruby 缩进为 2，C 缩进为 3.&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Fri, 20 Mar 2015 21:02:21 +0800</pubDate>
      <link>https://ruby-china.org/topics/24757</link>
      <guid>https://ruby-china.org/topics/24757</guid>
    </item>
    <item>
      <title>LeetCode 支持 Ruby 和 JavaScript 了</title>
      <description>&lt;p&gt;&lt;a href="https://leetcode.com/" rel="nofollow" target="_blank"&gt;https://leetcode.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="https://l.ruby-china.com/photo/2015/d728f94872cc4e1ecd1520096c276437.png" title="" alt=""&gt;&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Fri, 13 Mar 2015 23:16:10 +0800</pubDate>
      <link>https://ruby-china.org/topics/24640</link>
      <guid>https://ruby-china.org/topics/24640</guid>
    </item>
    <item>
      <title>Web 开发原型设计工具</title>
      <description>&lt;p&gt;关于 开发 WEB 应用，有哪些值得推荐的原型设计工具？除了纸和笔。我想做简单的，几个页面的那种。&lt;/p&gt;

&lt;p&gt;我搜到了两个&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="http://balsamiq.com/products/mockups/" rel="nofollow" target="_blank"&gt;http://balsamiq.com/products/mockups/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gomockingbird.com/" rel="nofollow" target="_blank"&gt;https://gomockingbird.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>springwq</author>
      <pubDate>Sat, 07 Mar 2015 11:20:25 +0800</pubDate>
      <link>https://ruby-china.org/topics/24518</link>
      <guid>https://ruby-china.org/topics/24518</guid>
    </item>
    <item>
      <title>成为一名初级 / 中级 Ruby on Rails 程序员应该具备怎样的技能树</title>
      <description>&lt;p&gt;对于一个没有其他编程经验的初学者，如果想成为一名 Ruby on Rails 的程序员应该具备怎么样的技能树？&lt;/p&gt;

&lt;p&gt;我了解到可以有下两种路线，目前我沿着第一条路线在走。&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;HTML/CSS/JS -》Ruby -》 Rails -》 DataBaste -》TDD -》Deployment （ FullStack ?）&lt;/li&gt;
&lt;li&gt;Ruby -》数据结构 -》算法 -》各种数据库 -》Sinatra -》Rails ( 牛逼的编程能力？)&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>springwq</author>
      <pubDate>Fri, 06 Mar 2015 00:27:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/24489</link>
      <guid>https://ruby-china.org/topics/24489</guid>
    </item>
    <item>
      <title>Carrierwave-qiniu 图片上传至七牛成功，但是无法在 App 上显示</title>
      <description>&lt;p&gt;参照 &lt;a href="https://github.com/huobazi/carrierwave-qiniu" rel="nofollow" target="_blank"&gt;https://github.com/huobazi/carrierwave-qiniu&lt;/a&gt; 配置完成后，可以正常上传至七牛，但是图片无法正常显示。&lt;/p&gt;

&lt;p&gt;Inspect Element 之后，看到代码是这样的，uploads 后面 为 %2F, 如果手动改为 / ,图片就正常显示了。&lt;/p&gt;

&lt;p&gt;&lt;img src="http://blue.qiniudn.com/uploads%2F2011-12-22_14.56.41.jpg" alt="Uploads%2f2011 12 22 14.56.41"&gt;&lt;/p&gt;

&lt;p&gt;报错图片在这里：&lt;a href="http://blue.qiniudn.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202014-12-24%20%E4%B8%8A%E5%8D%8812.11.32.png?imageView2/2/w/203/h/203&amp;amp;e=1419438029&amp;amp;token=8SyX3ZFXhOX-dLj5gCz6fslNPsRfs2ahqW6imoHC:nWLwh3TStMzBQZiqGAYbVh6cSig" rel="nofollow" target="_blank"&gt;http://blue.qiniudn.com/%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202014-12-24%20%E4%B8%8A%E5%8D%8812.11.32.png?imageView2/2/w/203/h/203&amp;amp;e=1419438029&amp;amp;token=8SyX3ZFXhOX-dLj5gCz6fslNPsRfs2ahqW6imoHC:nWLwh3TStMzBQZiqGAYbVh6cSig&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;是我哪里代码写的有问题吗？&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/springwq/photo_store" rel="nofollow" target="_blank"&gt;https://github.com/springwq/photo_store&lt;/a&gt;&lt;/p&gt;</description>
      <author>springwq</author>
      <pubDate>Wed, 24 Dec 2014 00:40:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/23369</link>
      <guid>https://ruby-china.org/topics/23369</guid>
    </item>
  </channel>
</rss>
