<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>zputee (zputee)</title>
    <link>https://ruby-china.org/zputee</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>Ruby 的类变量 (修正版)</title>
      <description>&lt;p&gt;昨天和&lt;a href="/zgm" class="user-mention" title="@zgm"&gt;&lt;i&gt;@&lt;/i&gt;zgm&lt;/a&gt; 等等的讨论，收益良多，感谢&lt;/p&gt;

&lt;p&gt;昨天关于类变量的帖子，写的比较匆忙，论证不严谨，更主要水平有限，所以重新写了一篇。本文从类变量读写的角度，更清晰一些。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;一、类变量的赋值&lt;/strong&gt;
在本类的 ancestors，反向查找。（即 Ojbect 中的类变量最优先----从 Object 类开始查找）
--&amp;gt; 找到，直接赋值
--&amp;gt; 找不到，在本类上创建类变量。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;二、类变量的读取&lt;/strong&gt;
在本类的 ancestors，反向查找。
--&amp;gt; 在父类中找到：返回父类中的类变量。(如果本类的有同名的类变量，同时被删除。)
--&amp;gt; 在本类中找到：返回本类中的类变量。&lt;/p&gt;
&lt;h2 id="--&gt; 找不到：报错。"&gt;--&amp;gt; 找不到：报错。&lt;/h2&gt;
&lt;p&gt;三、singleton 方法定义其他类中时，在外层类中查找（方法同以上）。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;一、类变量的赋值&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="vc"&gt;@@v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt; 

&lt;span class="c1"&gt;#1.在本类的ancestors，反向查找，父类Object有@@v&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C&lt;/span&gt;
  &lt;span class="vc"&gt;@@v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;90&lt;/span&gt;   &lt;span class="c1"&gt;#向父类中的@@v赋值。&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="vc"&gt;@@v&lt;/span&gt;       &lt;span class="c1"&gt;#=&amp;gt;90&lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;[]&lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt; &lt;span class="c1"&gt;#[:@@v]&lt;/span&gt;

&lt;span class="c1"&gt;#2.反向查找，父类中无@@v1,&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C&lt;/span&gt;
  &lt;span class="vc"&gt;@@v1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;  &lt;span class="c1"&gt;#在C中创建类变量@@v1&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt;[:@@v1]&lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt;  &lt;span class="c1"&gt;#=[:@@v] &lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;二、类变量的读取&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="vc"&gt;@@w&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;111&lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt; &lt;span class="c1"&gt;#[:@@w]&lt;/span&gt;

&lt;span class="c1"&gt;#1.反向查找，在父类Object中找到了&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C&lt;/span&gt;
  &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="vc"&gt;@@w&lt;/span&gt;    &lt;span class="c1"&gt;#=&amp;gt;111 ,返回父类中的@@w&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;类C中无@@W&lt;/span&gt;

&lt;span class="c1"&gt;#----------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;#准备工作&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C&lt;/span&gt;
  &lt;span class="vc"&gt;@@w2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;222&lt;/span&gt;        &lt;span class="c1"&gt;#新定义C类变量&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="vc"&gt;@@w2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;333&lt;/span&gt;          &lt;span class="c1"&gt;#在Object上，定义@@w2 &lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;Object中有@@w2&lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt;C中有@@W2&lt;/span&gt;
&lt;span class="c1"&gt;#现在父类Object和C类中都有@@w2&lt;/span&gt;

&lt;span class="c1"&gt;#2.开始读类变量。反向查找，在父类Object中找到了&lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variable_get&lt;/span&gt; &lt;span class="ss"&gt;:@@w2&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;333  #读出Object中@@w2,  删除本类中的@ww2  &lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt;[]   #C中已经无@@w2&lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variables&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;Object有@@w2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;三、singleton 方法定义其他类中时，在外层类查找。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#与外层不同类的single方法中，在外层类中查找！！&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="vc"&gt;@@v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"A"&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;class&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="vc"&gt;@@v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"B"&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;class&lt;/span&gt; &lt;span class="nc"&gt;C&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="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
 &lt;span class="c1"&gt;#B中有@@V, 类C的父类A 中也有@@v&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;B&lt;/span&gt;     
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;C&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;v&lt;/span&gt;    
    &lt;span class="vc"&gt;@@v&lt;/span&gt;    &lt;span class="c1"&gt;#读方法外层类B中的@@v&lt;/span&gt;
   &lt;span class="k"&gt;end&lt;/span&gt;       
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;v&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt;B&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zputee</author>
      <pubDate>Sun, 05 May 2013 10:17:37 +0800</pubDate>
      <link>https://ruby-china.org/topics/10715</link>
      <guid>https://ruby-china.org/topics/10715</guid>
    </item>
    <item>
      <title>Ruby 的类变量</title>
      <description>&lt;p&gt;昨天（2013-5-4) 本帖子，写的比较匆忙，论证不严谨，更主要水平有限，和&lt;a href="/zgm" class="user-mention" title="@zgm"&gt;&lt;i&gt;@&lt;/i&gt;zgm&lt;/a&gt; 等等的讨论，深受启发，收益良多，感谢&lt;/p&gt;
&lt;h2 id="今天，重新写了一篇。http://ruby-china.org/topics/10715， 从类变量读写的角度，更易理解。"&gt;今天，重新写了一篇。&lt;a href="http://ruby-china.org/topics/10715" rel="nofollow" target="_blank"&gt;http://ruby-china.org/topics/10715&lt;/a&gt;，从类变量读写的角度，更易理解。&lt;/h2&gt;
&lt;p&gt;附上新贴的三条主要观点。
&lt;strong&gt;一、类变量的赋值&lt;/strong&gt;
在本类的 ancestors，反向查找。（即 Ojbect 中的类变量最优先----从 Object 类开始查找）
 1.找到，直接赋值
 2.找不到，在本类上创建类变量。
&lt;strong&gt;二、类变量的读取&lt;/strong&gt;
在本类的 ancestors，反向查找。
 1.在父类中找到：返回父类中的类变量。(如果本类的有同名的类变量，同时被删除。)
 2.在本类中找到：返回本类中的类变量。
 3.找不到：报错。
三、singleton 方法定义其他类中时，在外层类及父类中读取类变量（方法与上面两点，基本相同)。&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;原观点，比较难于理解，所以&lt;/p&gt;
&lt;h2 id="加了下划线，没有删除。^_^"&gt;加了下划线，没有删除。^_^&lt;/h2&gt;
&lt;p&gt;&lt;del&gt;在动态编程时，ruby 的类变量很容易出错。&lt;/del&gt;
&lt;del&gt;&lt;strong&gt;方法中访问类变量&lt;/strong&gt;&lt;/del&gt;
&lt;del&gt;1. 方法定义的外层类的类变量。（外层，方法定义的静态位置！！！，注意 singleton 方法）&lt;/del&gt;
&lt;del&gt;2. 外层类的父类的 ancestors，反向查找。Ojbect 中的类变量最优先！&lt;/del&gt;
&lt;del&gt;3. inluded_modules 中查找。&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;&lt;del&gt;&lt;strong&gt;类定义中的类变量&lt;/strong&gt;&lt;/del&gt;
&lt;del&gt;1 .本类中的类变量。&lt;/del&gt;
&lt;del&gt;2. 父类的 ancestors，反向查找。Ojbect 中的类变量最优先！&lt;/del&gt;
&lt;del&gt;3. inluded_modules 中查找。&lt;/del&gt;&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;一、方法的外层类是 Object 类。&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;C&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="vc"&gt;@@var&lt;/span&gt; &lt;span class="o"&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="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;C&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi2&lt;/span&gt;
  &lt;span class="vc"&gt;@@var&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;   
&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi2&lt;/span&gt;            &lt;span class="c1"&gt;#err 因为此时方法的外层类是Ojbect，&lt;/span&gt;
&lt;span class="nb"&gt;self&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;class_variable_defined?&lt;/span&gt; &lt;span class="ss"&gt;:@@var&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;false, Object类无@@var类变量，所以出错。&lt;/span&gt;

&lt;span class="c1"&gt;#这时可以使用class_eval方法切换 context&lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_eval&lt;/span&gt; &lt;span class="sx"&gt;%{         
  def self.hi3;@@var; end
}&lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi3&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt;1&lt;/span&gt;

&lt;span class="c1"&gt;#--多谢12楼 @zgm 指出， 下面D2例子有错---------------------------------&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="vc"&gt;@@var2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&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;class&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi1&lt;/span&gt;          &lt;span class="c1"&gt;#外层D类中没有定义@@var&lt;/span&gt;
    &lt;span class="vc"&gt;@@var&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;D&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi1&lt;/span&gt;   &lt;span class="c1"&gt;#err&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C2&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="vc"&gt;@@var&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;&lt;span class="k"&gt;end&lt;/span&gt;    &lt;span class="c1"&gt;# 方法的外层类的类变量@@var=200&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;D&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt;200&lt;/span&gt;
&lt;span class="c1"&gt;#--- 方法的外层类中没有定义@@var=200,所以报错。这验证了关于外层的结论。----------------&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;二、父类 Object 中的@@var 覆盖 子类 C3 中的@@var&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;C3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="vc"&gt;@@var3&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;100&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;class&lt;/span&gt; &lt;span class="nc"&gt;C33&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;C3&lt;/span&gt;           
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;
     &lt;span class="vc"&gt;@@var3&lt;/span&gt;     &lt;span class="c1"&gt;#可以访问父类C3中的类变量&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;C33&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;100&lt;/span&gt;

&lt;span class="vc"&gt;@@var3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;    &lt;span class="c1"&gt;#总父类Object中的@@var3，优先C3中的@@var&lt;/span&gt;
&lt;span class="no"&gt;C33&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;&amp;gt;200&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C33&lt;/span&gt;
  &lt;span class="vc"&gt;@@var&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;   &lt;span class="c1"&gt;#修改的是Object类中的@@var&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;C33&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;     &lt;span class="c1"&gt;#=&amp;gt;300&lt;/span&gt;
&lt;span class="vc"&gt;@@var&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt;300&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;三、模块中的类变量（容易出错!!!）&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Mm&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="vc"&gt;@@m&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;800&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;class&lt;/span&gt; &lt;span class="nc"&gt;CC&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Mm&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;
    &lt;span class="vc"&gt;@@m&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;CC&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;          &lt;span class="c1"&gt;#=&amp;gt;800&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CC2&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;CC&lt;/span&gt;
  &lt;span class="vc"&gt;@@m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;900&lt;/span&gt;    &lt;span class="c1"&gt;#=&amp;gt;覆盖了Mm中的@@m&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;CC2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;       &lt;span class="c1"&gt;#=&amp;gt;900&lt;/span&gt;
&lt;span class="no"&gt;Mm&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variable_get&lt;/span&gt; &lt;span class="ss"&gt;:@@m&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;900,已经改变了Mm中的@@m&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CC3&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Mm&lt;/span&gt;
  &lt;span class="vc"&gt;@@m&lt;/span&gt;    &lt;span class="c1"&gt;#=&amp;gt;这里@@m已经为900了！！！&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;四、class 关键字是类变量的切换门（静态位置）&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;Q&lt;/span&gt;
  &lt;span class="vc"&gt;@@q&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;class&lt;/span&gt; &lt;span class="nc"&gt;Q2&lt;/span&gt;                      &lt;span class="c1"&gt;#class关键字，类变量门, 访问不到外层了。&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;
      &lt;span class="vc"&gt;@@q&lt;/span&gt;                      &lt;span class="c1"&gt;#访问不到外层的@@q&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="vc"&gt;@@q&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;Q&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Q2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;    &lt;span class="c1"&gt;#=&amp;gt;err  Q2中无类变量@@q&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;五、静态位置 &amp;gt; 继承 &amp;gt; include &lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 静态位置优先与继承&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;W&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="vc"&gt;@@w&lt;/span&gt; &lt;span class="o"&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;W11&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;W&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;class&lt;/span&gt; &lt;span class="nc"&gt;W1x&lt;/span&gt; 
  &lt;span class="vc"&gt;@@w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;W11&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;
      &lt;span class="vc"&gt;@@w&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;W11&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;           &lt;span class="c1"&gt;#=&amp;gt;2 , ( 静态位置优先与继承）&lt;/span&gt;
&lt;span class="no"&gt;W11&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variable_get&lt;/span&gt; &lt;span class="ss"&gt;:@@w&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;1&lt;/span&gt;

&lt;span class="c1"&gt;#----------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;# 继承优先 include&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;W2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="vc"&gt;@@w2&lt;/span&gt;&lt;span class="o"&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="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;M2&lt;/span&gt;  &lt;span class="vc"&gt;@@w2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&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;class&lt;/span&gt; &lt;span class="nc"&gt;W22&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;W2&lt;/span&gt; 
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;M2&lt;/span&gt;
  &lt;span class="nb"&gt;p&lt;/span&gt;  &lt;span class="vc"&gt;@@w2&lt;/span&gt;       &lt;span class="c1"&gt;#=&amp;gt;1, 继承优先 include&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;M2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variable_get&lt;/span&gt; &lt;span class="ss"&gt;:@@w2&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;2&lt;/span&gt;

&lt;span class="c1"&gt;#------------------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;# 静态位置有先与 include&lt;/span&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;M3&lt;/span&gt;  &lt;span class="vc"&gt;@@w3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&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;class&lt;/span&gt; &lt;span class="nc"&gt;W3&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;M3&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;W3x&lt;/span&gt;
  &lt;span class="vc"&gt;@@w3&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;def&lt;/span&gt; &lt;span class="nc"&gt;W3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;
      &lt;span class="vc"&gt;@@w3&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;W3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;     &lt;span class="c1"&gt;#=&amp;gt;3 , 静态位置有先与 include&lt;/span&gt;
&lt;span class="no"&gt;W3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_variable_get&lt;/span&gt; &lt;span class="ss"&gt;:@@w3&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;总结&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;和常量类似，静态位置&amp;gt; 继承 &amp;gt; inlude &lt;/li&gt;
&lt;li&gt;&lt;p&gt;class 关键字是类变量空间切换门&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Object 中的类变量，相当于全局变量。（如果在 Kernel 中猴子补丁可访问？）&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;父类中的类变量与子类中的同名类变量是 同一个类变量。&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;singleton 方法定义中访问类中的类变量，可以用 class_eval 方法切换 &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>zputee</author>
      <pubDate>Sat, 04 May 2013 15:49:30 +0800</pubDate>
      <link>https://ruby-china.org/topics/10702</link>
      <guid>https://ruby-china.org/topics/10702</guid>
    </item>
    <item>
      <title>Ruby 中的常量</title>
      <description>&lt;p&gt;看了&lt;a href="http://ruby-china.org/topics/10654" rel="nofollow" target="_blank"&gt;http://ruby-china.org/topics/10654&lt;/a&gt; 7 楼的例子，很受启发。&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;常量，“戴帽”访问最好，如 M::N。&lt;/li&gt;
&lt;li&gt;常量，搜索顺序

&lt;ol&gt;
&lt;li&gt;Module.nesting（静态位置)&lt;/li&gt;
&lt;li&gt;include &lt;/li&gt;
&lt;li&gt;Class inherence&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;hr&gt;

&lt;p&gt;一、静态位置（Module.nesting）优先 include。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;M&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="no"&gt;N&lt;/span&gt; &lt;span class="o"&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="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;M2&lt;/span&gt;
   &lt;span class="no"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C&lt;/span&gt;
    &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;M&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="no"&gt;N&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="no"&gt;M2&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;n&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt;&amp;gt;2&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;C1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="no"&gt;N&lt;/span&gt;&lt;span class="o"&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C2&lt;/span&gt;
  &lt;span class="no"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;                     &lt;span class="c1"&gt;#位置优先继承&lt;/span&gt;
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C3&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;C2&lt;/span&gt;              
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="no"&gt;N&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="no"&gt;C2&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;C3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;n&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;..
三、include 优先继承&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;C5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="no"&gt;N&lt;/span&gt;&lt;span class="o"&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="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;M3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="no"&gt;N&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&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;class&lt;/span&gt; &lt;span class="nc"&gt;C55&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;C5&lt;/span&gt;            
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;M3&lt;/span&gt;         &lt;span class="c1"&gt;#include优先继承&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="no"&gt;N&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="no"&gt;C55&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;n&lt;/span&gt;     &lt;span class="c1"&gt;#=&amp;gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zputee</author>
      <pubDate>Sat, 04 May 2013 11:57:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/10697</link>
      <guid>https://ruby-china.org/topics/10697</guid>
    </item>
    <item>
      <title>关于类名常量</title>
      <description>&lt;p&gt;看了 RubyChina 关于常量的发言，引发了我对常量的兴趣：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;类名为什么是常量？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;类名常量的作用域？&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;类名常量和类的关系？&lt;/strong&gt;
感谢&lt;a href="/chenge" class="user-mention" title="@chenge"&gt;&lt;i&gt;@&lt;/i&gt;chenge&lt;/a&gt; &lt;a href="/lgn21st" class="user-mention" title="@lgn21st"&gt;&lt;i&gt;@&lt;/i&gt;lgn21st&lt;/a&gt; &lt;a href="/luikore" class="user-mention" title="@luikore"&gt;&lt;i&gt;@&lt;/i&gt;luikore&lt;/a&gt; 等等的鼓励和指教，感谢 RubyChina。&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;
&lt;h3 id="一、类名为什么是常量？"&gt;一、类名为什么是常量？&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#当前类是Object&lt;/span&gt;
&lt;span class="nb"&gt;self&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;Object&lt;/span&gt;
&lt;span class="c1"&gt;#添加一个类C&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C&lt;/span&gt; &lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;grep&lt;/span&gt;  &lt;span class="sr"&gt;/^C$/&lt;/span&gt; 
&lt;span class="c1"&gt;#=&amp;gt;[:C]      &lt;/span&gt;
&lt;span class="c1"&gt;#这时在当前类Object中添加了常量 :C&lt;/span&gt;
&lt;span class="c1"&gt;#:所以类名是常量。&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id="二、这里的类名常量C，为什么是所有作用域可见？"&gt;二、这里的类名常量 C，为什么是所有作用域可见？&lt;/h3&gt;
&lt;p&gt;类名常量 C 添加在 Object 类中
Object 是所有类的 superclass（BasicObject 除外），所以在所有类中都可见。&lt;/p&gt;

&lt;p&gt;如果：&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;M&lt;/span&gt; 
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C&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="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;grep&lt;/span&gt;  &lt;span class="sr"&gt;/^M$/&lt;/span&gt; 
&lt;span class="c1"&gt;#=&amp;gt;[:M]&lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;grep&lt;/span&gt;  &lt;span class="sr"&gt;/^C$/&lt;/span&gt; 
&lt;span class="c1"&gt;#=&amp;gt;[]&lt;/span&gt;
&lt;span class="no"&gt;M&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constants&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;[:C]&lt;/span&gt;

&lt;span class="c1"&gt;#---------关于 Kernel#load 方法的实验----------&lt;/span&gt;
&lt;span class="c1"&gt;#person.rb&lt;/span&gt;
&lt;span class="c1"&gt;#class Person; end&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C&lt;/span&gt;
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;init&lt;/span&gt;
      &lt;span class="nb"&gt;load&lt;/span&gt; &lt;span class="s1"&gt;'./person.rb'&lt;/span&gt;     
     &lt;span class="k"&gt;end&lt;/span&gt;
     &lt;span class="n"&gt;init&lt;/span&gt;              &lt;span class="c1"&gt;#load到Object，而不是C::D&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;grep&lt;/span&gt; &lt;span class="sr"&gt;/^C$|^Person$/&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;[:C,:Person]&lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;grep&lt;/span&gt; &lt;span class="sr"&gt;/^D$/&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;[]&lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constants&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;[:D]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;
&lt;h3 id="三、类名常量C和类C的关系"&gt;三、类名常量 C 和类 C 的关系&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#类名常量C是指向（reference）类C的对象&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;C&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi&lt;/span&gt;
    &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hi, in class C'&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;#变量cc&lt;/span&gt;
&lt;span class="n"&gt;cc&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;C&lt;/span&gt;           
&lt;span class="n"&gt;cc&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;"C"&lt;/span&gt;
&lt;span class="n"&gt;cc&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;hi&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt; 'hi, in class C'         &lt;/span&gt;

&lt;span class="c1"&gt;#改变常量C，（实验需要，平时不建议改变常量^_^）&lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"i'm string now"&lt;/span&gt;   &lt;span class="c1"&gt;#assign&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;warning.....        &lt;/span&gt;
&lt;span class="c1"&gt;#C还是常量&lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;grep&lt;/span&gt;  &lt;span class="sr"&gt;/^C$/&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;[:C]  &lt;/span&gt;
&lt;span class="no"&gt;C&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;"i'm string now"&lt;/span&gt;
&lt;span class="c1"&gt;#指向了String类的对象。&lt;/span&gt;

&lt;span class="c1"&gt;#变量cc没变，指向类C&lt;/span&gt;
&lt;span class="n"&gt;cc&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;"C"&lt;/span&gt;
&lt;span class="n"&gt;cc&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;hi&lt;/span&gt;        
&lt;span class="c1"&gt;#=&amp;gt; 'hi, in class C'&lt;/span&gt;

&lt;span class="c1"&gt;#D是常量&lt;/span&gt;
&lt;span class="no"&gt;D&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;cc&lt;/span&gt;         
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;constants&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;grep&lt;/span&gt;  &lt;span class="sr"&gt;/^C$|^D$/&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;[:C,:D]&lt;/span&gt;
&lt;span class="no"&gt;D&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;"C"&lt;/span&gt;
&lt;span class="c1"&gt;#常量D指向类C&lt;/span&gt;

&lt;span class="c1"&gt;#打开类C，添加方法sing&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;D&lt;/span&gt;       &lt;span class="c1"&gt;# D是指向类C的常量!!!&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sing&lt;/span&gt;
    &lt;span class="s1"&gt;'singing'&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;#常量D和变量cc共同指向C类&lt;/span&gt;
&lt;span class="no"&gt;D&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
&lt;span class="n"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;[:hi,:sing] &lt;/span&gt;

&lt;span class="c1"&gt;#通过变量cc，向类C 添加方法&lt;/span&gt;
&lt;span class="n"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:define_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:dance&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="s2"&gt;"dance"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  
&lt;span class="n"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;D&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;[:hi,:sing,:dance]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zputee</author>
      <pubDate>Mon, 29 Apr 2013 10:16:49 +0800</pubDate>
      <link>https://ruby-china.org/topics/10608</link>
      <guid>https://ruby-china.org/topics/10608</guid>
    </item>
    <item>
      <title>ruby 的 Block，Proc，Lambda ---4</title>
      <description>&lt;p&gt;一、代码块不是对象。&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#{p "hi"} 是代码块&lt;/span&gt;
&lt;span class="c1"&gt;#代码块不是对象。&lt;/span&gt;
 &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hi'&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;SyntaxError: unexpected '}', expecting $end&lt;/span&gt;

&lt;span class="c1"&gt;#所以代码块不能调用方法call&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hi'&lt;/span&gt;&lt;span class="p"&gt;}.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;{p 'hi'}.call&lt;/span&gt;
&lt;span class="c1"&gt;#        ^&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;二、 &lt;strong&gt;&amp;amp;proc 只存在于方法和方法调用的参数中，但不是一般的参数&lt;/strong&gt;。（&amp;amp;proc 像 Proc 类的对象的指针，可以这么理解，&amp;amp;proc 不是对象）&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;def m
  yield
end
pp = lambda{ p "hi, world"}
m(&amp;amp;pp)        #&amp;lt;---- &amp;amp;pp 方法调用的参数中, 但不是一般的参数。
#=&amp;gt;"hi, world"

pp            #是Proc的对象
"#&amp;lt;Proc: (lambda)&amp;gt;"
&amp;amp;pp            #不是对象
#=&amp;gt;SyntaxError: unexpected tAMPER, expecting $end

&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;三、Proc 类的对象与 Method 类的对象很像，可带调用参数，它们可以相互转换。
&lt;a href="http://ruby-china.org/topics/10470" rel="nofollow" target="_blank"&gt;http://ruby-china.org/topics/10470&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;m&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;pp&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="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;"hi, world"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:m&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;Method&lt;/span&gt;
&lt;span class="n"&gt;pp&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;/code&gt;&lt;/pre&gt;</description>
      <author>zputee</author>
      <pubDate>Fri, 26 Apr 2013 09:53:51 +0800</pubDate>
      <link>https://ruby-china.org/topics/10524</link>
      <guid>https://ruby-china.org/topics/10524</guid>
    </item>
    <item>
      <title> 动态添加类方法  (eigenclass --- 2)</title>
      <description>&lt;p&gt;&lt;strong&gt;类是类的 singleton_class 类（eigenclass 类）的实例对象&lt;/strong&gt;
先有蛋还是先有鸡？
类、类、类....，有点累吧，^_^&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;一、向类添加的实例方法，（添加类的 singleton_method）&lt;/strong&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;MyClass&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="c1"&gt;#方法1(动态)&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_eval&lt;/span&gt; &lt;span class="sx"&gt;%{  
  def hi
    p "hi,world"
  end
}&lt;/span&gt;
&lt;span class="c1"&gt;#方法2(动态）&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:define_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:hi2&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hi, world'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;#调用&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi2&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;"hi,world"&lt;/span&gt;
&lt;span class="c1"&gt;#检查&lt;/span&gt;
&lt;span class="n"&gt;a&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;grep&lt;/span&gt; &lt;span class="sr"&gt;/^hi+/&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;二、添加类方法，（添加类的 singleton_method）&lt;/strong&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;MyClass&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;#方法1，使用class_eval(动态）&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_eval&lt;/span&gt; &lt;span class="sx"&gt;%{  
  def self.hi
    p "hi,world"
  end
}&lt;/span&gt;
&lt;span class="c1"&gt;#方法2，使用send(动态）&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:define_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:hi2&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hi, world'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;#方法3, 打开MyClass.singleton_class (eigenclass)&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="no"&gt;MyClass&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi3&lt;/span&gt;
    &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s2"&gt;"hi,world"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi2&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi3&lt;/span&gt;

&lt;span class="no"&gt;MyClass&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="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;三、向 engenclass 类方法，（可以继承，很少用!）&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;class &lt;span class="nt"&gt;&amp;lt;&lt;/span&gt;&lt;span class="err"&gt;&amp;lt;&lt;/span&gt;&lt;span class="na"&gt;MyClass&lt;/span&gt; &lt;span class="na"&gt;#很少用&lt;/span&gt;
  &lt;span class="na"&gt;def&lt;/span&gt; &lt;span class="na"&gt;self.hello&lt;/span&gt;
    &lt;span class="na"&gt;p&lt;/span&gt; &lt;span class="err"&gt;"&lt;/span&gt;&lt;span class="na"&gt;i&lt;/span&gt;&lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;m&lt;/span&gt; &lt;span class="na"&gt;in&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;MyClass.singleton_classs.methods&lt;/span&gt;&lt;span class="err"&gt;'"&lt;/span&gt;
  &lt;span class="na"&gt;end&lt;/span&gt;
&lt;span class="na"&gt;end&lt;/span&gt;
&lt;span class="na"&gt;MyClass.singleton_class.hello&lt;/span&gt;
&lt;span class="na"&gt;MyClass.singleton_class.methods&lt;/span&gt;&lt;span class="err"&gt;(&lt;/span&gt;&lt;span class="na"&gt;false&lt;/span&gt;&lt;span class="err"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zputee</author>
      <pubDate>Wed, 24 Apr 2013 21:51:46 +0800</pubDate>
      <link>https://ruby-china.org/topics/10483</link>
      <guid>https://ruby-china.org/topics/10483</guid>
    </item>
    <item>
      <title>动态添加对象的方法 ( eigenclass --- 1 )</title>
      <description>&lt;p&gt;&lt;strong&gt;一、简介&lt;/strong&gt;
对象的 &lt;strong&gt;singleton_class&lt;/strong&gt;，Matz 也称 &lt;strong&gt;eigenclass&lt;/strong&gt;。
表面上看不到，但它就像影子一样，一直伴随着对象，无处不在，比较神秘吧。&lt;/p&gt;

&lt;p&gt;我给它起了别名，&lt;strong&gt;对象伴侣类&lt;/strong&gt;。
类也是对象，&lt;strong&gt;类也有对象伴侣类&lt;/strong&gt;。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;二、动态向对象添加方法，即对象的单例方法 (对象的 eigenclass 类的实例方法)&lt;/strong&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;MyClass&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;MyClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;

&lt;span class="c1"&gt;#方法1&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="n"&gt;my_object&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello1&lt;/span&gt;
    &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hello,world'&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;#方法2 , send&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:define_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:hello2&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="s1"&gt;'hello, world2 '&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;#方法3，通过给类添加了实例方法&lt;/span&gt;
&lt;span class="n"&gt;my_object&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;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:define_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:hello3&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="s1"&gt;'hello, world3 '&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;#方法4（等效）&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_eval&lt;/span&gt; &lt;span class="sx"&gt;%{
  def hello4
    p 'hello,world4'
  end
}&lt;/span&gt;
&lt;span class="c1"&gt;#方法5（等效，但self 语义有点乱，不提倡本方法）&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_eval&lt;/span&gt; &lt;span class="sx"&gt;%{
  def self.hello5
    p 'hello,world5'
  end
}&lt;/span&gt;
&lt;span class="c1"&gt;#写法6   ---  2013.4.25 &lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;my_object&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello6&lt;/span&gt;
    &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hello,world6'&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;#写法7  ---  2012.4.25&lt;/span&gt;
&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;M&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello7&lt;/span&gt;
    &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hello world7'&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="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;my_object&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;M&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;  

&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt;"hello,world"&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello2&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;"hello,world2"&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello3&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;"hello,world3"&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello4&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;"hello,world4"&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello5&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;"hello,world5"&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello6&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;"hello,world6"&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello7&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;"hello,world7"&lt;/span&gt;

&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_methods&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;my_object&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;instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;总结：&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;向对象的 singleton_class 类添加（对象单例方法）&lt;/li&gt;
&lt;li&gt;&lt;p&gt;向对象的类添加（所有实例都可调用）&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;my_object 是 my_object.singleton_class 的实例，现有蛋还是现有鸡，有点乱？&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;X + y = my_object.methods = my_object.singleton_class.instance_methods
其中： 
X=my_object.instance_methods
Y=my_object.singleton_methods = my_object.singleton_class.instance_methods(false)&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;三、向对象的 eigenclass 添加方法（理论上可行，不常用）&lt;/strong&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="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;my_object&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;
    &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hi,world'&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;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;  &lt;span class="c1"&gt;#=&amp;gt;"hi, world"&lt;/span&gt;
&lt;span class="n"&gt;my_object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;methods&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zputee</author>
      <pubDate>Wed, 24 Apr 2013 20:55:54 +0800</pubDate>
      <link>https://ruby-china.org/topics/10479</link>
      <guid>https://ruby-china.org/topics/10479</guid>
    </item>
    <item>
      <title>反思” 题目太大了，hold 不住 “</title>
      <description>&lt;p&gt;&lt;strong&gt;反思：&lt;/strong&gt; 原帖题目太大，hold 不住。
其实主要想讲两点体会和一个猜测：&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;.英雄不问出路，即 ruby 著名的  &lt;strong&gt;Duck Typing 概念&lt;/strong&gt;，如果它走路来像鸭子，叫声像鸭子，它就可以当作鸭子。&lt;/li&gt;
&lt;li&gt;ruby 的 &lt;strong&gt;程序块&lt;/strong&gt; 挑战  &lt;strong&gt;好莱坞准则&lt;/strong&gt;：叫我做什么，不要叫我怎么做。&lt;/li&gt;
&lt;li&gt;BDD 发展方向：-。CDD（convention 驱动开发） -&amp;gt; 动态学习规则 -&amp;gt; 智能软件？
（又有点大&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ruby 对传统面向对象编程的挑战&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;用 ruby 编程，是面向对象的编程吗？&lt;/p&gt;

&lt;p&gt;面向对象编程的发展历史：
&lt;strong&gt;血统论&lt;/strong&gt;：起初面向对象编程是以继承为基础，面向对象编程。
&lt;strong&gt;党派论&lt;/strong&gt;：Java 出现后，面向对象编程转向面向接口编程。
&lt;strong&gt;能力论&lt;/strong&gt;：ruby 出现了著名的  &lt;strong&gt;Duck Typing 概念&lt;/strong&gt;，如果它走路来像鸭子，叫声像鸭&amp;gt;子，它就是鸭子。&lt;/p&gt;

&lt;p&gt;ruby 的 &lt;strong&gt;程序块&lt;/strong&gt;挑战了面向对象编程的 &lt;strong&gt;好莱坞准则&lt;/strong&gt;：叫我做什么，不要叫我怎么&amp;gt;做。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;结论：ruby 是以对象为基层的面向规则的编程&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <author>zputee</author>
      <pubDate>Wed, 24 Apr 2013 19:52:03 +0800</pubDate>
      <link>https://ruby-china.org/topics/10477</link>
      <guid>https://ruby-china.org/topics/10477</guid>
    </item>
    <item>
      <title>ruby 的 Block，Proc，Lambda ---3</title>
      <description>&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/a2a791927976686d9fa20aed183f74db.jpg" title="" alt=""&gt;
&lt;strong&gt;一、’Proc 类的对象‘和对象的’method‘关系&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Proc 类的对象运行在定义时程序的 Context。&lt;/li&gt;
&lt;li&gt;对象的 method 运行在对象的 Context。&lt;/li&gt;
&lt;li&gt;对象的 method 是 Method 类的实例。&lt;/li&gt;
&lt;li&gt;它们可与相互转换。&lt;/li&gt;
&lt;li&gt;由 method 转换到 Proc 类的对象时，不绑定当前域的局部变量。&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;二、method 转到 Proc 的对象&lt;/strong&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;plus&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="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="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:plus&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;grep&lt;/span&gt; &lt;span class="sr"&gt;/^to./&lt;/span&gt;  &lt;span class="c1"&gt;# to_proc 方法&lt;/span&gt;
&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:plus&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;to_proc&lt;/span&gt;           &lt;span class="c1"&gt;# 转换为&lt;/span&gt;
&lt;span class="n"&gt;p1&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;# Proc的对象&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;math&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="c1"&gt;#在函数中使用上面生成的p1&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;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;end&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;math&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;p1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
&lt;span class="c1"&gt;#=&amp;gt;5&lt;/span&gt;

&lt;span class="n"&gt;p2&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;method&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:plus&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;               &lt;span class="c1"&gt;# 2013.4.25    &lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;math&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;              &lt;span class="c1"&gt;#default call  to_proc method&lt;/span&gt;
&lt;span class="vg"&gt;$=&lt;/span&gt;&lt;span class="o"&gt;&amp;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;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="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="ss"&gt;:to_s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;            &lt;span class="c1"&gt;#2013,4.25&lt;/span&gt;
&lt;span class="c1"&gt;#=&amp;gt;["1", "2", "3"]&lt;/span&gt;
&lt;span class="c1"&gt;#其中 &amp;amp;:to_s  ===&amp;gt;   proc{ | o | o.send(self) }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;三 Proc 的对象转到 method&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;p1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hi,world'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;A&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;
&lt;span class="c1"&gt;#1.添加类的实例方法&lt;/span&gt;
&lt;span class="no"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:define_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:hi&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;p1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;   
&lt;span class="no"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;instance_methods&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kp"&gt;false&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="nf"&gt;hi&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt;"hi,world"&lt;/span&gt;
&lt;span class="c1"&gt;#2.添加为类方法&lt;/span&gt;
&lt;span class="no"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;singleton_class&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:define_method&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:hi&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;p1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;A&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="kp"&gt;false&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;A&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&lt;/span&gt;   &lt;span class="c1"&gt;#=&amp;gt;"hi,world"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zputee</author>
      <pubDate>Wed, 24 Apr 2013 15:52:32 +0800</pubDate>
      <link>https://ruby-china.org/topics/10470</link>
      <guid>https://ruby-china.org/topics/10470</guid>
    </item>
    <item>
      <title>ruby 的 Block，Proc，Lambda ---2</title>
      <description>&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/a2a791927976686d9fa20aed183f74db.jpg" title="" alt=""&gt;
&lt;strong&gt;一、什么是 ruby 中的代码块？&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;大括号 + 代码 { p 'hi'}&lt;/li&gt;
&lt;li&gt;do ...  end，也是代码块&lt;/li&gt;
&lt;li&gt;ruby 中万物皆对象，块不是。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;二、块怎样转换成对象？&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;proc  + 代码块&lt;/li&gt;
&lt;li&gt;Proc.new  + 代码块&lt;/li&gt;
&lt;li&gt;lambda  + 代码块&lt;/li&gt;
&lt;li&gt;-&amp;gt;  + 代码块&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;三、使用参数&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;#一、关于&amp;amp;block的参数&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;teach_math&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="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="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"let's begin teach math"&lt;/span&gt;
  &lt;span class="n"&gt;block&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="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="c1"&gt;#&amp;lt;=&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="c1"&gt;#二、关于yield的参数 （与方法一完全等效）&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;teach_math2&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="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"let's begin teach math"&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;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="c1"&gt;#&amp;lt;=&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="c1"&gt;#--------------------------------------&lt;/span&gt;
&lt;span class="c1"&gt;#1、最简洁，最常用的&lt;/span&gt;
&lt;span class="n"&gt;teach_math2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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="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="n"&gt;y&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;y&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;#加法&lt;/span&gt;

&lt;span class="c1"&gt;#2、Proc实例          &lt;/span&gt;
&lt;span class="n"&gt;pp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Proc&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="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="n"&gt;y&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;y&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;    &lt;span class="c1"&gt;#减法&lt;/span&gt;
&lt;span class="n"&gt;teach_math2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#3、简写Proc实例 &lt;/span&gt;
&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;proc&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="n"&gt;y&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;y&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;teach_math2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#4、lambda&lt;/span&gt;
&lt;span class="n"&gt;ll&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;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&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;y&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;        &lt;span class="c1"&gt;# 乘法&lt;/span&gt;
&lt;span class="n"&gt;teach_math2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;ll&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;#5、简写的lambda&lt;/span&gt;
&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&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;y&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;teach_math2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&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="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr&gt;

&lt;p&gt;&lt;strong&gt;总结&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1、3、5 比较简洁。&lt;/li&gt;
&lt;li&gt;lambda 更严谨些。&lt;/li&gt;
&lt;li&gt;lambda，和 Proc.new 有两点细微的差别（1.return，2.参数数量严格否）&lt;/li&gt;
&lt;/ul&gt;</description>
      <author>zputee</author>
      <pubDate>Wed, 24 Apr 2013 15:47:00 +0800</pubDate>
      <link>https://ruby-china.org/topics/10469</link>
      <guid>https://ruby-china.org/topics/10469</guid>
    </item>
    <item>
      <title>ruby 的 Block，Proc，Lambda ---1</title>
      <description>&lt;p&gt;&lt;img src="//l.ruby-china.com/photo/a2a791927976686d9fa20aed183f74db.jpg" title="" alt=""&gt;
&lt;strong&gt;一、简介&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;任何函数的调用，都可以传入 Proc 的对象。&lt;/li&gt;
&lt;li&gt;在任何函数中，添加一条语句（yield），就可以处理传入的：Proc 的对象&lt;/li&gt;
&lt;li&gt;ruby 的块操作，使用十分方便，无处不在。&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;二、例子（可在 irb 中运行）&lt;/strong&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;A&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;hi&lt;/span&gt; 
    &lt;span class="s1"&gt;'morning'&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="c1"&gt;#方式1,任何函数只要加入一条语句，立刻具有处理块的能力，神奇吧&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi2&lt;/span&gt;
    &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;block_given&lt;/span&gt;&lt;span class="err"&gt;？&lt;/span&gt;     &lt;span class="c1"&gt;# 只要这一句&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;  
  &lt;span class="c1"&gt;#方式2,传入Proc 完全等价方式1, 繁琐，没有必要使用。&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hi3&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;block&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;      &lt;span class="c1"&gt;#注意 &amp;amp; 字符&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;  
  &lt;span class="c1"&gt;#方式3, 传入Proc对象是为了保存。&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;save_it&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="vi"&gt;@block&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;block&lt;/span&gt;  &lt;span class="c1"&gt;#存入实例变量@block中    &lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="c1"&gt;#续方式3, 保存Proc是为了以后调用。 &lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;call_it&lt;/span&gt;
    &lt;span class="vi"&gt;@block.call&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vi"&gt;@block&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;a&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;A&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;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi&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="nb"&gt;p&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;"morning"&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi2&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hi'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;"hi"&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hi3&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hi'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;"hi"&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;save_it&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="s1"&gt;'hi, proc'&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;#=&amp;gt;"#&amp;lt;Proc:...&amp;gt;"&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_it&lt;/span&gt;               &lt;span class="c1"&gt;#=&amp;gt;"hi,proc"&lt;/span&gt;
&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;call_it&lt;/span&gt;               &lt;span class="c1"&gt;#=&amp;gt;"hi,proc"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>zputee</author>
      <pubDate>Wed, 24 Apr 2013 15:36:31 +0800</pubDate>
      <link>https://ruby-china.org/topics/10467</link>
      <guid>https://ruby-china.org/topics/10467</guid>
    </item>
  </channel>
</rss>
