<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>cy1806152142 (cheng.ya)</title>
    <link>https://ruby-china.org/cy1806152142</link>
    <description/>
    <language>en-us</language>
    <item>
      <title>关于元编程问题</title>
      <description>&lt;h2 id="Help!!!"&gt;Help!!!&lt;/h2&gt;
&lt;p&gt;最近在看 ruby 元编程 遇到如下问题 求大神赐教&lt;/p&gt;
&lt;h5 id="代码如下"&gt;代码如下&lt;/h5&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AnotherClass&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;3&lt;/span&gt;       &lt;span class="c1"&gt;#类变量&lt;/span&gt;
  &lt;span class="vi"&gt;@v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;          &lt;span class="c1"&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;OneClass&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add_method_to&lt;/span&gt; &lt;span class="n"&gt;aClass&lt;/span&gt;
    &lt;span class="n"&gt;aClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;class_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="nc"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new_method&lt;/span&gt;  &lt;span class="c1"&gt;#定义AnotherClass类的一个类方法&lt;/span&gt;
        &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="vi"&gt;@v&lt;/span&gt;
        &lt;span class="nb"&gt;p&lt;/span&gt; &lt;span class="vc"&gt;@@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="k"&gt;end&lt;/span&gt; 
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;obj&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;OneClass&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;obj&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add_method_to&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;AnotherClass&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="no"&gt;AnotherClass&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new_method&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="问题概述"&gt;问题概述&lt;/h3&gt;
&lt;p&gt;元编程中关于&lt;strong&gt;class_eval&lt;/strong&gt;函数的描述：
&lt;strong&gt;class_eval() 方法会同时修改 self 和当前类，通过修改当前类，class_eval() 实际上
是重新打开了该类，就像 class 关键字所做的一样。&lt;/strong&gt;
如上所述，class_eval 打开了类，那么自然可以访问类变量，然而上述代码运行结果
如下：&lt;/p&gt;

&lt;p&gt;4&lt;/p&gt;

&lt;p&gt;in `new_method': uninitialized class variable @@v in OneClass (NameError)&lt;/p&gt;

&lt;p&gt;如上，类实例变量可以访问，但类变量却不可以，&lt;strong&gt;WHY?&lt;/strong&gt;&lt;/p&gt;</description>
      <author>cy1806152142</author>
      <pubDate>Sat, 25 Feb 2017 14:52:33 +0800</pubDate>
      <link>https://ruby-china.org/topics/32381</link>
      <guid>https://ruby-china.org/topics/32381</guid>
    </item>
  </channel>
</rss>
