<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>alevui42 (Dong.Xu)</title>
    <link>https://ruby-china.org/alevui42</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>RubyConf China 2016 会有录像吗？</title>
      <description>&lt;p&gt;RubyConf China 2016 已经过去 1 一个月了~ 那么，之前是有录像的，有计划上传公布吗？如果有的话，时间上有安排吗~&lt;/p&gt;</description>
      <author>alevui42</author>
      <pubDate>Tue, 25 Oct 2016 12:17:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/31429</link>
      <guid>https://ruby-china.org/topics/31429</guid>
    </item>
    <item>
      <title>[翻译] Ruby Monk － 深入 Ruby block (一)</title>
      <description>&lt;p&gt;原文链接 &lt;a href="https://rubymonk.com/learning/books/4-ruby-primer-ascent" rel="nofollow" target="_blank"&gt;https://rubymonk.com/learning/books/4-ruby-primer-ascent&lt;/a&gt; 其中的 Blocks 部分
用词的错误应该不少，各位如果看到了请指出，谢谢。&lt;/p&gt;
&lt;h2 id="深入Ruby block（一）"&gt;深入 Ruby block（一）&lt;/h2&gt;
&lt;p&gt;通常来说，block（块）会成为学习 Ruby 的过程中遇到的第一个坎。很多时候会很困惑，block 是什么？为什么会有这玩意儿的存在？我要怎么用它们？&lt;/p&gt;

&lt;p&gt;那么，就来一点一点地深入到 block 的细节中吧。&lt;/p&gt;
&lt;h2 id="block是什么？"&gt;block 是什么？&lt;/h2&gt;
&lt;p&gt;在 Ruby 中，block 并不罕见。官方对 block 的定义是“一段被包裹着的代码”。当然，我觉得这样的解释不会让你变的更明白。&lt;/p&gt;

&lt;p&gt;对 block 的一种更简单的描述是“一个 block 就是一段存储在一个变量中的代码，它和其他的对象一样，可以被随时的运行”&lt;/p&gt;

&lt;p&gt;然后，咱们通过看一些代码，之后再把这些代码重构成 Ruby 中的 block 形式。通过代码来实际的感受，更加直观。&lt;/p&gt;

&lt;p&gt;比如，对两个数做加法？&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;嗯，这样写是可以的。但是，这样的代码只做到了 block 定义的前半部分——它是一段代码。但是它并没有“被包裹起来”，也没有“存储在一个变量中”。&lt;/p&gt;

&lt;p&gt;所以，我们需要继续修改。不过在把它包裹起来之前，我们先改进一下，让它看起来更通用。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;
&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;好～这样就可以了——我们用变量替换了之前的数字。这段代码执行了一个相加的过程，但是，它仍然没有被储存在一个变量中。&lt;/p&gt;

&lt;p&gt;现在，咱们来实现它。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;addition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;b&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;addition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&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="c1"&gt;# =&amp;gt; 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;好啦，现在你把它很好的包裹起来了——这就是一个 block！&lt;/p&gt;

&lt;p&gt;使用‘lambda’关键字，是 Ruby 中创建 block 的最常见的方法。还有其他的方法也可以做到，不过现在先不管其他的方法。&lt;/p&gt;

&lt;p&gt;这个时候你可能会想“等等，这玩意儿看起来就像是一个方法（method），除了没有类和对象“。你说的没错。甚至可以这样去理解：一个 block 就像一个方法（method），但是它不与任何的对象关联。&lt;/p&gt;

&lt;p&gt;咱们继续，更仔细的来看看 block。&lt;/p&gt;

&lt;p&gt;block 是对象吗？当然，就像 Ruby 中的其它东西一样，block 也是对象。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;empty_block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&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;empty_block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;object_id&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; 28765760&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;empty_block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; Proc&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;empty_block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;superclass&lt;/span&gt;
&lt;span class="c1"&gt;# =&amp;gt; Object&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如你所见，我们创建的这个 block 有一个 object_id ,属于 Proc 类（这是 Ruby 里面对一个 block 的称呼），而这个类本身就是 Object 的子类。&lt;/p&gt;

&lt;p&gt;我们甚至可以反过来，从 block 定义方法（method）。一个方法（method）就是绑定了一个对象的 block，从而可以访问对象的“状态”。&lt;/p&gt;

&lt;p&gt;下面我来演示一下逆向的用一个方法（method）来创建一个 block。有一些更传统的方法来实现前面的问题（同时请原谅我糟糕的对象建模）&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;Calculator&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="no"&gt;Calculator&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="nf"&gt;add&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="c1"&gt;# =&amp;gt; 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&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;Calculator&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;b&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;addition_method&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Calculator&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="nf"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"add"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;addition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;addition_method&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_proc&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;addition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&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="c1"&gt;# =&amp;gt; 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在呢，你就把一个传统的方法（method）转换为了一个 block！&lt;/p&gt;
&lt;h2 id="block化你的代码！"&gt;block 化你的代码！&lt;/h2&gt;
&lt;p&gt;咱们来构造 4 个 block，分别用来进行加减乘除的运算。每个 block 应该接受两个值作为变量，然后执行操作并返回结果。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Addition&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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;a&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="no"&gt;Subtraction&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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;a&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="no"&gt;Multiplication&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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;a&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="no"&gt;Division&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;lambda&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&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;a&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 使用的时候通过call来使用&lt;/span&gt;
&lt;span class="no"&gt;Addition&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&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="c1"&gt;# =&amp;gt; 11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>alevui42</author>
      <pubDate>Wed, 02 Mar 2016 18:19:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/29180</link>
      <guid>https://ruby-china.org/topics/29180</guid>
    </item>
    <item>
      <title>应该边工作边学吗？</title>
      <description>&lt;p&gt;请教各位一个问题。
现在的情况是这样的，我现在是大四，今年六月毕业。
我现在的兴趣是在 Ruby on Rails 上面，工作的目标也是这个方向的。而我是从昨年暑假之前开始正式学习 Rails 的，当时是跟着那本 Ruby on Rails Tutorial 做了一遍，然后有了一些基本的了解之后，自己又单独写了一点。
在暑假的时候，找了一个外包团队的实习工作。因为当时是觉得自己学的时候比较慢，而且不太清楚实际工作的时候需要用到什么，所以希望是可以通过实习，边工作边学习。
干了两个月之后，因为开学加上学校有事，就没继续下去了。而这两个月的时间里面，因为是外包团队，所以进度都挺赶的，而且每个项目的开发也并不规范，比如不会去写测试。
总之，两个月下来，我觉得学到了东西，但是并不是想象中那么高效。
－－
现在的问题是，我现在是应该找个工作，跟着学呢，还是这段时间先在家里面，自学呢？
哪种方法对我能力的提高更有效果呢？&lt;/p&gt;</description>
      <author>alevui42</author>
      <pubDate>Mon, 11 Jan 2016 12:58:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/28682</link>
      <guid>https://ruby-china.org/topics/28682</guid>
    </item>
  </channel>
</rss>
