<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>panywhang (Mr. Peng)</title>
    <link>https://ruby-china.org/panywhang</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>method_missing 的个人理解 (1)</title>
      <description>&lt;p&gt;ruby 的动态性的精华莫过于幽灵方法：methodmissing，如果我们在某一个对象中调用一个方法，ruby 会现在该对象声明的方法中查询，如果没有则向它的父类查询，直至顶层。如果再没有将会调用最底层的 methodmissing 方法，如果 methodmissing 方法中没有对应生命，则会自动向父类寻找，最终会跳转到顶层的 methodmissing 方法，以 method error 异常跳出&lt;/p&gt;

&lt;p&gt;那么我们在手动编写 method missing 方法时，有时会遇见以下问题：&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;A&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method_missing&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s1"&gt;'OK'&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;B&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;A&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="no"&gt;B&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;c&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;以上代码中，B 类没有声明 c 方法，系统自动向 B 的父类 A 中寻找方法 c，（忽略再向上层寻找），A 中也没有定义 c 方法，那么就会启动 methodmissing 机制，输出 OK 如果 c 不在我们预期的动态方法中，那么我们就应该将 c 作为异常抛出，但 methodmissing 似乎阻止了我们对 method error 异常的处理，怎么办？？？&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;A&lt;/span&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;args&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s1"&gt;'OK'&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="ss"&gt;:a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:b&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;# 我们只预期a和b两个方法&lt;/span&gt;
    &lt;span class="k"&gt;super&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;向上面这样，将我们的预期方法写在前面，当 c 传入 methodmissing 的时候，系统先对参数进行判断，既不是 a，也不是 b 那么就向下执行 super，调用 A 的父类的 methodmissing 方法，直至顶层并以 method error 跳出&lt;/p&gt;</description>
      <author>panywhang</author>
      <pubDate>Tue, 18 Dec 2012 18:42:29 +0800</pubDate>
      <link>https://ruby-china.org/topics/7669</link>
      <guid>https://ruby-china.org/topics/7669</guid>
    </item>
  </channel>
</rss>
