<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>neverlandxy_naix (Spirit)</title>
    <link>https://ruby-china.org/neverlandxy_naix</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>[上海] 薄荷科技再招聘 Ruby 小伙伴</title>
      <description>&lt;p&gt;&lt;strong&gt;又又要招人了，上次的 &lt;a href="https://ruby-china.org/topics/35131" title=""&gt;招聘贴&lt;/a&gt; 已经成功招聘到几位强力小伙伴，感谢强大的 RubyChina :)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这次招聘的小伙伴主要偏向后端开发，详细如下：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;关于职位&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;我们希望你是有 1~3 年的后端开发经验工程师&lt;/li&gt;
&lt;li&gt;熟练掌握 Ruby 和 Rails, 在后端 API 设计上有自己独特的理解&lt;/li&gt;
&lt;li&gt;编程基础良好，了解常见设计模式和编程最佳实践，追求优雅的代码&lt;/li&gt;
&lt;li&gt;热爱技术开发，有极客精神，参与过开源项目或常写技术博客加分哦&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;关于工作&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这次招聘的小伙伴主要工作会在这些事情上：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;为薄荷 App 开发 API 接口&lt;/li&gt;
&lt;li&gt;设计薄荷微服务间的 RPC 接口&lt;/li&gt;
&lt;li&gt;继续推动并实施薄荷各个项目的微服务化，docker 化&lt;/li&gt;
&lt;li&gt;对薄荷千万级数据进行数据分析，统计和数据埋单&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;关于待遇&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;初中级职位 10~15k, 高级职位 15~30k, 上不封顶。每季度还可能有丰厚的绩效奖金。&lt;/p&gt;

&lt;p&gt;目前公司处于快速发展阶段，公司商业模式确定，营收稳健，并且已有顶尖美元风投基金加入 (晨兴，SIG, DCM 和高通), 并即将确定下一轮融资，前景可期。我们将把你视为伙伴，希望通过一起努力，能够提供超出你预期的回报。&lt;/p&gt;

&lt;p&gt;详细的公司介绍，大家可参考今年薄荷的上一个 &lt;a href="https://ruby-china.org/topics/35131" title=""&gt;招聘贴&lt;/a&gt;, 在这里就不重复了~&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;联系方式&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;最后快到碗里来，薄荷期待你的加入 E-mail: huangxuanyu(at)boohee.com&lt;/p&gt;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Wed, 18 Apr 2018 11:20:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/35476</link>
      <guid>https://ruby-china.org/topics/35476</guid>
    </item>
    <item>
      <title>Ruby 中的 OpenStruct 详解</title>
      <description>&lt;h3 id="什么是 Struct?"&gt;什么是 Struct?&lt;/h3&gt;
&lt;p&gt;在 C 语言中，有一种数据类型叫做 Struct, 定义一个 Struct 相当于定义了一个自定义的数据类型，里面可以包含各种不同的其它数据类型。例如：&lt;/p&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;person&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;age&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt;
  &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;sex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同样在 Ruby 中，也有 &lt;a href="https://github.com/ruby/ruby/blob/trunk/struct.c" rel="nofollow" target="_blank" title=""&gt;Struct&lt;/a&gt;, 纯 C 实现，用于快速声明一个 Class, 例如：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Struct&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="ss"&gt;:age&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:sex&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;me&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Person&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="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'Spirit'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'male'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;age&lt;/span&gt;  &lt;span class="c1"&gt;# =&amp;gt; 24&lt;/span&gt;
&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Test'&lt;/span&gt;
&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;name&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 'Test'&lt;/span&gt;
&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;height&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; NoMethodError&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当然，我们也可以通过定义 Class 来实现同样的功能，但是 Struct 的快速声明功能是直接定义 Class 无法实现的。&lt;/p&gt;
&lt;h3 id="OpenStruct 详解"&gt;OpenStruct 详解&lt;/h3&gt;
&lt;p&gt;在上面的实例中，可以看到，&lt;code&gt;me&lt;/code&gt; 无法动态响应任意的属性，&lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/ostruct.rb" rel="nofollow" target="_blank" title=""&gt;OpenStruct&lt;/a&gt; 类恰巧就完成了这件事情。&lt;/p&gt;

&lt;p&gt;还是上面那个例子：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'ostruct'&lt;/span&gt;

&lt;span class="n"&gt;me&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;OpenStruct&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="ss"&gt;age: &lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s1"&gt;'Spirit'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;sex: &lt;/span&gt;&lt;span class="s1"&gt;'male'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;height&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; nil&lt;/span&gt;
&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;height&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'178'&lt;/span&gt;
&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;height&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; '178'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;翻看 &lt;code&gt;OpenStruct&lt;/code&gt; 的源码，可以看到其核心为 &lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/ostruct.rb#L87" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;#initialize()&lt;/code&gt;&lt;/a&gt;, &lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/ostruct.rb#L166" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;#new_ostruct_member()&lt;/code&gt;&lt;/a&gt; 和 &lt;a href="https://github.com/ruby/ruby/blob/trunk/lib/ostruct.rb#L176" rel="nofollow" target="_blank" title=""&gt;&lt;code&gt;#method_missing()&lt;/code&gt;&lt;/a&gt; 三个方法：&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;initialize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kp"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="vi"&gt;@table&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;
    &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;each_pair&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;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_sym&lt;/span&gt;
      &lt;span class="vi"&gt;@table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;k&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="n"&gt;new_ostruct_member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&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;/code&gt;&lt;/pre&gt;
&lt;p&gt;初始化，一旦传入的参数为 hash, 则把 hash 的键值对一一保存到实例变量 &lt;code&gt;@table&lt;/code&gt; 中，并且调用 &lt;code&gt;#new_ostruct_member()&lt;/code&gt; 方法&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;new_ostruct_member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_sym&lt;/span&gt;
  &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="nb"&gt;respond_to?&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;define_singleton_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="vi"&gt;@table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;define_singleton_method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;="&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;x&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;modifiable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;name&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="p"&gt;}&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="nb"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为每一个传入的 name(hash 的 key) 都生成两个实例方法 &lt;code&gt;#name&lt;/code&gt; 与 &lt;code&gt;#name=&lt;/code&gt;, 并且定义其值为实例变量 &lt;a href="/table" class="user-mention" title="@table"&gt;&lt;i&gt;@&lt;/i&gt;table&lt;/a&gt; 中对应的 key 的值&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;method_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;mname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;id2name&lt;/span&gt;
  &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;length&lt;/span&gt;
  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;mname&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;chomp!&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'='&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;len&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;raise&lt;/span&gt; &lt;span class="no"&gt;ArgumentError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"wrong number of arguments (&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;len&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; for 1)"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;caller&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="k"&gt;end&lt;/span&gt;
    &lt;span class="n"&gt;modifiable&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;new_ostruct_member&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mname&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;elsif&lt;/span&gt; &lt;span class="n"&gt;len&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="vi"&gt;@table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="k"&gt;else&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;NoMethodError&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt; &lt;span class="s2"&gt;"undefined method `&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;' for &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;set_backtrace&lt;/span&gt; &lt;span class="nb"&gt;caller&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="k"&gt;raise&lt;/span&gt; &lt;span class="n"&gt;err&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;code&gt;#method_missing&lt;/code&gt; 方法&lt;/p&gt;

&lt;p&gt;当初始化的时候没有传入 hash, 或者让对象响应一个任意的方法时：&lt;/p&gt;

&lt;p&gt;如果需要响应方法为 &lt;code&gt;mname=&lt;/code&gt;, 并且实参为一个，那么调用 &lt;code&gt;#new_ostruct_member()&lt;/code&gt; 方法，为实例定义两个方法 &lt;code&gt;#mname&lt;/code&gt; 与 &lt;code&gt;#mname=&lt;/code&gt;, 下次调用该方法时，则不需要经过 &lt;code&gt;method_missing&lt;/code&gt; 这一步骤&lt;/p&gt;

&lt;p&gt;如果需要响应的方法为 &lt;code&gt;mname&lt;/code&gt;, 并且没有实参，那么直接返回 &lt;code&gt;@table&lt;/code&gt; 中对应的 &lt;code&gt;k&lt;/code&gt; 的值&lt;/p&gt;

&lt;p&gt;事实上，除非为 &lt;code&gt;@table&lt;/code&gt; 注入一个 &lt;code&gt;{ mname: value }&lt;/code&gt; 的键值对或者调用 &lt;code&gt;obj.mname=value&lt;/code&gt;, 否则直接调用 &lt;code&gt;obj.mname&lt;/code&gt; 经过 &lt;code&gt;method_missing&lt;/code&gt; 后返回的值，都为 &lt;code&gt;nil&lt;/code&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;me&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;OpenStruct&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="ss"&gt;age: &lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;name: &lt;/span&gt;&lt;span class="s1"&gt;'Spirit'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;sex: &lt;/span&gt;&lt;span class="s1"&gt;'male'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;height&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; 'nil'&lt;/span&gt;
&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_eval&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="vi"&gt;@table&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:height&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;178&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;me&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;height&lt;/span&gt; &lt;span class="c1"&gt;# =&amp;gt; '178'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ok, &lt;code&gt;OpenStruct&lt;/code&gt; 详解完毕，其余方法可自行挖掘。&lt;/p&gt;

&lt;p&gt;最后说一句，&lt;code&gt;OpenStruct&lt;/code&gt; 由于进行了 &lt;code&gt;method_missing&lt;/code&gt; 判断，其性能与 &lt;code&gt;Struct&lt;/code&gt; 相比，可谓是天差地别。&lt;a href="http://stackoverflow.com/questions/1177594/ruby-struct-vs-openstruct" rel="nofollow" target="_blank" title=""&gt;http://stackoverflow.com/questions/1177594/ruby-struct-vs-openstruct&lt;/a&gt;&lt;/p&gt;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Fri, 19 Sep 2014 16:48:18 +0800</pubDate>
      <link>https://ruby-china.org/topics/21617</link>
      <guid>https://ruby-china.org/topics/21617</guid>
    </item>
    <item>
      <title>写了两个关于天气查询的 gem - think_page (心知天气) 与 smart_weather (中国气象局)</title>
      <description>&lt;p&gt;最近在对接一些外部的 API 服务，写了一个基于 &lt;a href="https://github.com/rest-client/rest-client" rel="nofollow" target="_blank" title=""&gt;rest-client&lt;/a&gt; 的包装器 &lt;a href="https://github.com/awesome-api/restclient_api_base" rel="nofollow" target="_blank" title=""&gt;restclient_api_base&lt;/a&gt;, 在这个基础上完成了两个天气查询的 gem 包 -- &lt;a href="https://github.com/awesome-api/think_page" rel="nofollow" target="_blank" title=""&gt;think_page&lt;/a&gt; 和 &lt;a href="https://github.com/awesome-api/smart_weather" rel="nofollow" target="_blank" title=""&gt;smart_weather&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;大家有需求的可以试试，帮助我一起改善这几个 Gem. &lt;/p&gt;
&lt;h2 id="ThinkPage"&gt;ThinkPage&lt;/h2&gt;
&lt;p&gt;心知天气 (ThinkPage) Ruby SDK, 详细参数请见 &lt;a href="http://www.thinkpage.cn/weather/api/" rel="nofollow" target="_blank" title=""&gt;天气数据接口 API&lt;/a&gt;, 心知天气的城市列表请见 &lt;a href="http://www.thinkpage.cn/weather/api/cities.aspx" rel="nofollow" target="_blank" title=""&gt;城市列表&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Installation:&lt;/p&gt;

&lt;p&gt;Add this line to your application's Gemfile:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gem 'think_page'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And then execute:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ bundle&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or install it yourself as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gem install think_page&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Usage:&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'think_page'&lt;/span&gt;

&lt;span class="no"&gt;ThinkPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;private_params&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="ss"&gt;key: &lt;/span&gt;&lt;span class="s1"&gt;'Your key'&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# 获取指定城市的全部天气信息&lt;/span&gt;
&lt;span class="no"&gt;ThinkPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_all&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;city: &lt;/span&gt;&lt;span class="s1"&gt;'CHBJ000000'&lt;/span&gt;&lt;span class="o"&gt;....&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 获取指定城市的实时天气&lt;/span&gt;
&lt;span class="no"&gt;ThinkPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_now&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;city: &lt;/span&gt;&lt;span class="s1"&gt;'CHBJ000000'&lt;/span&gt;&lt;span class="o"&gt;....&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 获取指定城市的预报天气&lt;/span&gt;
&lt;span class="no"&gt;ThinkPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_future&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;city: &lt;/span&gt;&lt;span class="s1"&gt;'CHBJ000000'&lt;/span&gt;&lt;span class="o"&gt;....&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 获取指定城市的AQI、PM2.5、PM10、CO、NO2、O3等空气质量信息&lt;/span&gt;
&lt;span class="no"&gt;ThinkPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_air&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;city: &lt;/span&gt;&lt;span class="s1"&gt;'CHBJ000000'&lt;/span&gt;&lt;span class="o"&gt;....&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 获取指定城市的穿衣、紫外线、汽车、感冒、运动等生活建议指数信息&lt;/span&gt;
&lt;span class="no"&gt;ThinkPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_suggestion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;city: &lt;/span&gt;&lt;span class="s1"&gt;'CHBJ000000'&lt;/span&gt;&lt;span class="o"&gt;....&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 获取过去24小时每小时天气和空气质量历史数据。仅支持大客户会员&lt;/span&gt;
&lt;span class="no"&gt;ThinkPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_history24h&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;city: &lt;/span&gt;&lt;span class="s1"&gt;'CHBJ000000'&lt;/span&gt;&lt;span class="o"&gt;....&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 获取每个城市分别根据历史数据计算的每天天气预报准确度。仅支持大客户会员&lt;/span&gt;
&lt;span class="no"&gt;ThinkPage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_accuracy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;city: &lt;/span&gt;&lt;span class="s1"&gt;'CHBJ000000'&lt;/span&gt;&lt;span class="o"&gt;....&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="SmartWeather"&gt;SmartWeather&lt;/h2&gt;
&lt;p&gt;中国气象网 SmartWeatherAPI Ruby SDK&lt;/p&gt;

&lt;p&gt;详细接口说明请见 &lt;a href="http://smart.weather.com.cn/wzfw/smart/weatherapi.shtml" rel="nofollow" target="_blank" title=""&gt;SmartWeatherAPI_Lite_WebAPI 版产品使用说明书&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Installation: &lt;/p&gt;

&lt;p&gt;Add this line to your application's Gemfile:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gem 'smart_weather'&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;And then execute:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ bundle&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Or install it yourself as:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;$ gem install smart_weather&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Usage: &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'smart_weather'&lt;/span&gt;

&lt;span class="no"&gt;SmartWeather&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;app_id&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'your app id'&lt;/span&gt;
&lt;span class="no"&gt;SmartWeather&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;private_key&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'your private_key'&lt;/span&gt;

&lt;span class="c1"&gt;# 获取支持的省份&lt;/span&gt;
&lt;span class="no"&gt;SmartWeather&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Province&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;

&lt;span class="c1"&gt;# 获取支持的城市的 areaid&lt;/span&gt;
&lt;span class="no"&gt;SmartWeather&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;City&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;

&lt;span class="c1"&gt;# 天气实况&lt;/span&gt;
&lt;span class="no"&gt;SmartWeather&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_observe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;areaid: &lt;/span&gt;&lt;span class="s1"&gt;'101010100'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 常规预报(3d)&lt;/span&gt;
&lt;span class="no"&gt;SmartWeather&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_forecast&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;areaid: &lt;/span&gt;&lt;span class="s1"&gt;'101010100'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;# 天气指数&lt;/span&gt;
&lt;span class="no"&gt;SmartWeather&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get_index&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;areaid: &lt;/span&gt;&lt;span class="s1"&gt;'101010100'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Thu, 04 Sep 2014 16:13:52 +0800</pubDate>
      <link>https://ruby-china.org/topics/21387</link>
      <guid>https://ruby-china.org/topics/21387</guid>
    </item>
    <item>
      <title>重构真是件体力活</title>
      <description>&lt;p&gt;对系统的某个重要模块进行重构，持续进行了一个礼拜，好几天加班到深夜，终于达到了自己想要的效果，不得不说，重构真是件体力活&lt;img title=":tired_face:" alt="😫" src="https://twemoji.ruby-china.com/2/svg/1f62b.svg" class="twemoji"&gt;&lt;/p&gt;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Sun, 18 May 2014 14:55:11 +0800</pubDate>
      <link>https://ruby-china.org/topics/19346</link>
      <guid>https://ruby-china.org/topics/19346</guid>
    </item>
    <item>
      <title>写了个 播报"xx 宝"收益的命令行工具 (Ruby 版)</title>
      <description>&lt;p&gt;受到 &lt;a href="https://github.com/coolzilj/xxb" rel="nofollow" target="_blank" title=""&gt;xxb&lt;/a&gt; 的启发，由于 Node 版本的 xxb 速度较慢，大概需要 2s, 所以编写一个 Ruby 版本的 &lt;a href="https://github.com/NaixSpirit/xxbao" rel="nofollow" target="_blank" title=""&gt;xxbao&lt;/a&gt;, 采用多线程，所需时间 0.6s 左右，在此感谢 &lt;a href="https://github.com/coolzilj/xxb" rel="nofollow" target="_blank" title=""&gt;xxb&lt;/a&gt; 的作者 &lt;a href="https://github.com/coolzilj" rel="nofollow" target="_blank" title=""&gt;Liu Jin&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src="http://naixspirit.com/images/xxbao.png" title="" alt="screenshot"&gt;&lt;/p&gt;

&lt;p&gt;实在搞不定中文表格的处理，样式总是无法对齐，不知道社区有哪位高手有过处理命令行中文表格的经验...&lt;/p&gt;
&lt;h3 id="Usage"&gt;Usage&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;gem install xxbao&lt;/code&gt;
Just run &lt;code&gt;xxbao&lt;/code&gt; , you will get the pretty table.&lt;/p&gt;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Sun, 20 Apr 2014 14:45:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/18733</link>
      <guid>https://ruby-china.org/topics/18733</guid>
    </item>
    <item>
      <title>一份 Ruby 面试题</title>
      <description>&lt;p&gt;出了份 Ruby 面试题，主要是考察对 &lt;strong&gt;Ruby 本身&lt;/strong&gt; 掌握的深度.
给大家看看有什么不妥的地方。&lt;/p&gt;

&lt;p&gt;Ruby 基础相关&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;each&lt;/code&gt; 和 &lt;code&gt;map&lt;/code&gt; 的区别&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;proc&lt;/code&gt;, &lt;code&gt;lambda&lt;/code&gt;, 和 &lt;code&gt;Proc&lt;/code&gt; 的区别&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;alias&lt;/code&gt; 的用法，&lt;code&gt;alias&lt;/code&gt; 与 &lt;code&gt;alias_method&lt;/code&gt; 的区别&lt;/li&gt;
&lt;li&gt;用过那些 gem, 简单的说一说各自的用途&lt;/li&gt;
&lt;li&gt;画个图，体现一下 Ruby 的对象体系&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ruby 与 Rails 进阶相关&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;yield self&lt;/code&gt; 的用法，写个例子&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;scope&lt;/code&gt; 的实现原理&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;ActiveSupport::Concern&lt;/code&gt; 模块的用法及源码解读&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;alias_method_chain&lt;/code&gt; 的用法及源码解读&lt;/li&gt;
&lt;/ol&gt;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Mon, 12 Aug 2013 17:51:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/13272</link>
      <guid>https://ruby-china.org/topics/13272</guid>
    </item>
    <item>
      <title>求一种转换数组的简洁、高端、大气、上档次的方法</title>
      <description>&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"0.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"1.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"1.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"2.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"2.3"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"3.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"4.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"4.2"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# 需要转换为&lt;/span&gt;
&lt;span class="p"&gt;[[&lt;/span&gt;&lt;span class="s2"&gt;"0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"0.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"0.2"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;"1.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"1.3"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"2.2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"2.3"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"3.2"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"4.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"4.2"&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;就是根据数组中的元素，把它 &lt;code&gt;split(".")&lt;/code&gt; 成为一个数组之后，如果数组的第一项相同，就把这个元素放到这样一个数组里面 &lt;code&gt;["0.0", "0.1", "0.2"]&lt;/code&gt;
比如说 &lt;code&gt;"0.0", "0.1", "0.2"&lt;/code&gt; 分割后第一项都相同，就把它们放在一起&lt;/p&gt;

&lt;p&gt;求一种简洁、高端、大气、上档次的转换方法～&lt;/p&gt;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Wed, 29 May 2013 18:56:16 +0800</pubDate>
      <link>https://ruby-china.org/topics/11328</link>
      <guid>https://ruby-china.org/topics/11328</guid>
    </item>
    <item>
      <title>如何使用 ruby-prof 对 sinatra 进行性能测试</title>
      <description>&lt;p&gt;请问各位是如何对 sinatra app 做性能测试呢？&lt;/p&gt;

&lt;p&gt;我用了一个 &lt;strong&gt;&lt;a href="https://github.com/ruby-prof/ruby-prof" rel="nofollow" target="_blank" title=""&gt;ruby-prof&lt;/a&gt;&lt;/strong&gt; 的 gem&lt;/p&gt;

&lt;p&gt;新建了一个文件，在里面写入下列代码，本意是想在 &lt;strong&gt;每一个 get 请求上都调用 RubyProf&lt;/strong&gt; ，可是实际执行后输出的是 Ruby 内部 define_method 的性能，并没有输入我每一次 get 请求的性能。&lt;br&gt;
请问这样该如何去做？thanks&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;Sinatra::Base&lt;/span&gt;

  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;self&lt;/span&gt;
    &lt;span class="k"&gt;alias&lt;/span&gt; &lt;span class="ss"&gt;:oldget&lt;/span&gt; &lt;span class="ss"&gt;:get&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;get&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{},&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;
      &lt;span class="no"&gt;RubyProf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;
      &lt;span class="n"&gt;oldget&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;opts&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;RubyProf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stop&lt;/span&gt;
      &lt;span class="n"&gt;output_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;

    &lt;span class="kp"&gt;private&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;output_result&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;filepath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"./config/ruby_prof.txt"&lt;/span&gt;&lt;span class="p"&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="n"&gt;filepath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'a+'&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="no"&gt;RubyProf&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;GraphPrinter&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="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;print&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="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;/code&gt;&lt;/pre&gt;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Sat, 27 Apr 2013 15:17:02 +0800</pubDate>
      <link>https://ruby-china.org/topics/10570</link>
      <guid>https://ruby-china.org/topics/10570</guid>
    </item>
    <item>
      <title>招聘区 6 个月前的帖子现在顶帖不会自动浮上来了？</title>
      <description>&lt;p&gt;&lt;a href="/huacnlee" class="user-mention" title="@huacnlee"&gt;&lt;i&gt;@&lt;/i&gt;huacnlee&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;比如说这个帖子，&lt;a href="http://ruby-china.org/topics/6295" rel="nofollow" target="_blank"&gt;http://ruby-china.org/topics/6295&lt;/a&gt; ，顶帖后就不会自动浮上来了，是 Ruby-China 的 bug 还是做了相关的限制？&lt;/p&gt;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Tue, 23 Apr 2013 10:30:38 +0800</pubDate>
      <link>https://ruby-china.org/topics/10426</link>
      <guid>https://ruby-china.org/topics/10426</guid>
    </item>
    <item>
      <title>如何统计一个 Module 中所有的方法并输出方法所在的文件名和行数</title>
      <description>&lt;p&gt;有一个需求，需要统计一个 module 中所有的方法名，并输出方法所在的文件名和其所在的行数。这个 module 引用了很多其他的 module，需要把其他 module 的方法也输出。&lt;/p&gt;

&lt;p&gt;我的思路是建一个白板类，然后 include 这个 module，在输出其方法，但是不知道怎么输出方法所在的文件名和行数，麻烦高手赐教^_^&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;FindMethods&lt;/span&gt;

  &lt;span class="nb"&gt;instance_methods&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;m&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
    &lt;span class="n"&gt;undef_method&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;to_s&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;/^__|^methods/&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Module_Mymodule&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;


&lt;span class="n"&gt;my_methods&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;FindMethods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="n"&gt;my_methods&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;methods&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;m&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;m&lt;/span&gt;
  &lt;span class="k"&gt;next&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=~&lt;/span&gt; &lt;span class="sr"&gt;/^__|^methods/&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Tue, 29 Jan 2013 10:10:27 +0800</pubDate>
      <link>https://ruby-china.org/topics/8449</link>
      <guid>https://ruby-china.org/topics/8449</guid>
    </item>
    <item>
      <title>sublime 怎么了？</title>
      <description>&lt;p&gt;刚才在 windows 上登陆 &lt;a href="http://www.sublimetext.com" rel="nofollow" target="_blank"&gt;http://www.sublimetext.com&lt;/a&gt; ，弹出一个登陆对话框，要求输入用户名和密码？？⊙﹏⊙b
用 Ubuntu 可以正常登陆网站，但是在安装不了⊙﹏⊙b&lt;/p&gt;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Mon, 10 Dec 2012 14:50:42 +0800</pubDate>
      <link>https://ruby-china.org/topics/7438</link>
      <guid>https://ruby-china.org/topics/7438</guid>
    </item>
    <item>
      <title>新手学习钩子方法中遇到的问题，请高手赐教</title>
      <description>&lt;p&gt;最近在学习 Ruby 中的钩子方法，有一个地方没有弄明白，自己也没有 google 到解决办法，麻烦高手赐教。
书中有这么一段话：
当为任意类或模块定义一个名为 method_added 的方法，它将在为该类或模块定义一个实例方法时被调用。
值得注意的是，method_added 类方法会被该类的子类所继承。但是这个钩子方法没有任何类信息的参数，所以在添加某个方法时，无法知道是定义 method_added 方法所在的类添加的，还是它的某个子类所添加的。解决该问题的一个方法是为定义 method_added 的类同时定义 inherited 钩子方法，然后这个 inherited 方法为每个子类定义一个 method_added 方法。
我是这么定义的，这种方法可以正确的输出其子类和子类定义的方法
Ruby 版本是 187&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inherited&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;klass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;klass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_eval&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method_added&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;name&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;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; added a method &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&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="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SubClass&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;a_method&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="c1"&gt;# =&amp;gt; SubClass added a method a_method&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;def&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;inherited&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;klass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;klass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_eval&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
    &lt;span class="n"&gt;define_method&lt;/span&gt; &lt;span class="ss"&gt;:method_added&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="nb"&gt;name&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;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;klass&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; added a method &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="nb"&gt;name&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="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SubClass&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;String&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;a_method&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;</description>
      <author>neverlandxy_naix</author>
      <pubDate>Fri, 09 Nov 2012 16:22:40 +0800</pubDate>
      <link>https://ruby-china.org/topics/6643</link>
      <guid>https://ruby-china.org/topics/6643</guid>
    </item>
  </channel>
</rss>
