<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>shijin880921 (米阳)</title>
    <link>https://ruby-china.org/shijin880921</link>
    <description></description>
    <language>en-us</language>
    <item>
      <title>新人学 Ruby - alias, alias_method, alias_method_chain, undef, undef_method 的区别</title>
      <description>&lt;hr&gt;

&lt;p&gt;今天在看 calabash 的 wait_helpers.rb 类时偶然看到了 "alias_method"。不解，就顺便查下文档，发现几个相关关键字就索性做下记录，以便以后翻阅。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="alias"&gt;alias&lt;/h2&gt;
&lt;p&gt;alias 给已经存在的方法或全局变量设置一个别名，在重新定义已经存在的方法是，还能通过别名来调用原来的方法。alias 方法的参数为方法名或者符号名。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;
alias 别名 原名    #直接使用方法
alias :别名 :原名  #使用符号名&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;例子：&lt;/strong&gt;&lt;/p&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;AliasDemo&lt;/span&gt;
  &lt;span class="vg"&gt;$old&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"old"&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"old_hell0"&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;Demo2&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;AliasDemo&lt;/span&gt;
  &lt;span class="c1"&gt;# 给hello方法取别名&lt;/span&gt;
  &lt;span class="k"&gt;alias&lt;/span&gt; &lt;span class="n"&gt;old_hello&lt;/span&gt; &lt;span class="n"&gt;hello&lt;/span&gt;
  &lt;span class="c1"&gt;# 给全局变量$old取别名&lt;/span&gt;
  &lt;span class="k"&gt;alias&lt;/span&gt; &lt;span class="vg"&gt;$new_in_old&lt;/span&gt; &lt;span class="vg"&gt;$old&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"new_hello"&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;Demo2&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;hello&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;old_hello&lt;/span&gt;

&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vg"&gt;$new_in_old&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出结果：
new_hello
old_hell0
old&lt;/p&gt;
&lt;h2 id="alias_method"&gt;alias_method&lt;/h2&gt;
&lt;p&gt;作用和 alias 差不多，是 Module 的一个私有实例方法，只能用于给方法起别名，并且参试只能是字符串或者符号（alias 后面跟的是方法名或者全局变量）而且参数间是用“,”隔开（alias 是用空格隔开）。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;
alias_method :new_name, :old_name&lt;/p&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AliasMethodDemo&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;b&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"b"&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;

  &lt;span class="kp"&gt;alias_method&lt;/span&gt; &lt;span class="ss"&gt;:b_new&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:b&lt;/span&gt;

  &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;AliasMethodDemo&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;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b_new&lt;/span&gt;
  &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;b&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出结果：
b
b&lt;/p&gt;
&lt;h2 id="alias_method_chain"&gt;alias_method_chain&lt;/h2&gt;
&lt;p&gt;技术文档总是会过时的，百度还能找到这个关键字的说明，然而已经不再使用了。&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="undef 和 undef_method"&gt;undef 和 undef_method&lt;/h2&gt;
&lt;p&gt;这两个方法效果的等效的，都是用于取消方法定义。undef 不能出现再方法主体内。undef 和 rails 一样，参数可以指定方法名或者符号名，undef_method 后面参试只能是字符串或者符号。如果一个类继承了某个父类，使用了这两个方法取消方法，会连带父类也会一起取消。&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;语法：&lt;/strong&gt;
undef 方法名    #直接使用方法名
undef :方法名   #使用符号名
undef_method :方法名&lt;/p&gt;
&lt;h2 id="remove_method"&gt;remove_method&lt;/h2&gt;
&lt;p&gt;如果你只想移除子类的方法，而不想移除父类的方法，那么 remove_method 符合你需求。
&lt;strong&gt;语法：&lt;/strong&gt;
remove_method :方法名&lt;/p&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="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Parent&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"In parent"&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;Child&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Parent&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"In child"&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;c&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Child&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;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Child&lt;/span&gt;
  &lt;span class="n"&gt;remove_method&lt;/span&gt; &lt;span class="ss"&gt;:hello&lt;/span&gt; &lt;span class="c1"&gt;# 移除子类的hello方法，父类还在&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Child&lt;/span&gt;
  &lt;span class="n"&gt;undef_method&lt;/span&gt; &lt;span class="ss"&gt;:hello&lt;/span&gt; &lt;span class="c1"&gt;# 连父类的hello方法一起删除，不允许任何地方调用 'hello'&lt;/span&gt;
  &lt;span class="c1"&gt;# undef hello  # 等效上面的undef_method&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;hello&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出结果：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;=&amp;gt;:in `&amp;lt;top (required)&amp;gt;': undefined method `hello' for #&amp;lt;Child:0x007fe08c84c690&amp;gt; (NoMethodError)
    from -e:1:in `load'
    from -e:1:in `&amp;lt;main&amp;gt;'
In child
In parent
&lt;/code&gt;&lt;/pre&gt;</description>
      <author>shijin880921</author>
      <pubDate>Tue, 20 Oct 2015 12:21:35 +0800</pubDate>
      <link>https://ruby-china.org/topics/27747</link>
      <guid>https://ruby-china.org/topics/27747</guid>
    </item>
    <item>
      <title>新人学 Ruby - Ruby 中的模块</title>
      <description>&lt;h2 id="新人学ruby，有误望提出"&gt;新人学 ruby，有误望提出&lt;/h2&gt;&lt;h2 id="模块"&gt;模块&lt;/h2&gt;&lt;h2 id="模块是什么"&gt;模块是什么&lt;/h2&gt;
&lt;p&gt;ruby 同 JAVA 一样只支持单继承，每个类只能有一个父类，为了提高程序的灵活性 ruby 引入了 模块 为实现多重继承提供了可能。模块可以说是类的一个补充，但是模块于类有两个不同：&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;模块不能拥有实例&lt;/li&gt;
&lt;li&gt;模块不能被继承
---
## 如何创建模块
### 关键字：module&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="语法规则："&gt;语法规则：&lt;/h3&gt;
&lt;p&gt;module 模块名
    模块的定义
end&lt;/p&gt;
&lt;h3 id="注意："&gt;注意：&lt;/h3&gt;
&lt;p&gt;模块名必须是大写字母开头&lt;/p&gt;

&lt;hr&gt;
&lt;h2 id="模块的作用"&gt;模块的作用&lt;/h2&gt;&lt;h3 id="提供命名空间(解决重名问题)"&gt;提供命名空间 (解决重名问题)&lt;/h3&gt;
&lt;p&gt;这个个人理解类似 JAVA 的包，用于对方法，常量，类等名称进行区分及管理。模块提供独立的命名空间，例如模块 A 中的 say_hello 方法和模块 B 中的 say_hello 方法是属于不同的方法。
&lt;em&gt;例子：&lt;/em&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;HelloModule&lt;/span&gt;
    &lt;span class="c1"&gt;# 定义常量&lt;/span&gt;
      &lt;span class="no"&gt;Version&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'v1.0'&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;say_hello&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;"hello,&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="c1"&gt;# 指定say_hello 方法为模块函数&lt;/span&gt;
      &lt;span class="kp"&gt;module_function&lt;/span&gt; &lt;span class="ss"&gt;:say_hello&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注释：&lt;/strong&gt; 
&lt;em&gt;module_function:&lt;/em&gt; 的作用是把方法作为模块函数公开给外部使用，module_function 后面跟的参数是方法名。&lt;/p&gt;
&lt;h3 id="利用Mix-in扩展功能（解决ruby单继承）"&gt;利用 Mix-in 扩展功能（解决 ruby 单继承）&lt;/h3&gt;&lt;h4 id="什么是Mix-in？"&gt;什么是 Mix-in？&lt;/h4&gt;
&lt;p&gt;Mix-in 就是将模块混合到类中。在定义类时使用 include，从而在类中可以使用模块里的常量、方法等&lt;/p&gt;

&lt;p&gt;例子 1：使用关键字 &lt;em&gt;include&lt;/em&gt; 使类包含模块
代码：&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module Mod
  def meth
    puts "这是module"
  end
end

class ModuleDemo01
  include Mod
end

mod = ModuleDemo01.new
mod.meth
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出：
这是 module&lt;/p&gt;

&lt;p&gt;如果想校验类是否包含某个模块可以用如下方式：
类名.include?(模块名)  返回 true or false.&lt;/p&gt;
&lt;h4 id="使用Mix-in 时方法的查找顺序"&gt;使用 Mix-in 时方法的查找顺序&lt;/h4&gt;
&lt;p&gt;1）同继承关系一样，类自身已经定义了同名方法时，优先使用类自身的方法。
    &lt;strong&gt;例子：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module Mod
  def meth
    puts "这是module"
  end
end

class ModuleDemo01
  include Mod

  def meth
    puts "这个是类的方法"
  end
end

mod = ModuleDemo01.new
mod.meth
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;输出：&lt;/strong&gt;
这个是类的方法&lt;/p&gt;

&lt;p&gt;2）一个类中包含多个模块，优先使用最后一个包含的模块
&lt;strong&gt;例子：&lt;/strong&gt; &lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module Mod1
      def meth
        puts "这是Mod1"
      end
    end

    module Mod2
      def meth
        puts "这是Mod2"
      end
    end

    class ModuleDemo01
      include Mod1
      include Mod2
    end

    mod = ModuleDemo01.new
    mod.meth
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;输出：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这是 Mod2&lt;/p&gt;

&lt;p&gt;3) 多级嵌套 include 时，查找顺序也是线性的。
&lt;strong&gt;例子：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module Mod1
  def meth
    puts "这是Mod1"
  end
end

module Mod2
  def meth
    puts "这是Mod2"
  end
end

module Mod3
  include Mod2
end

class ModuleDemo01
  include Mod1
  include Mod3
end

mod = ModuleDemo01.new
mod.meth

p ModuleDemo01.ancestors
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;输出：&lt;/strong&gt;
这是 Mod2
[ModuleDemo01, Mod3, Mod2, Mod1, Object, Kernel, BasicObject]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;注释：&lt;/strong&gt; 通过 类名.ancetores 方法可以查看该类的继承关系和顺序。&lt;/p&gt;

&lt;p&gt;4）如果相同模块被包含两次以上（含两次），则第二次后的会被忽略。
&lt;strong&gt;例子：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module Mod1
     def meth
       puts "这是Mod1"
     end
   end

   module Mod2
     def meth
       puts "这是Mod2"
     end
   end

   module Mod3
     include Mod2
     include Mod1
     include Mod2
   end

   class ModuleDemo01
     include Mod1
     include Mod3
   end

   mod = ModuleDemo01.new
   mod.meth

   p ModuleDemo01.ancestors
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;输出：&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;这是 Mod1
[ModuleDemo01, Mod3, Mod1, Mod2, Object, Kernel, BasicObject]&lt;/p&gt;
&lt;h4 id="通过Mix-in 解决ruby单继承问题"&gt;通过 Mix-in 解决 ruby 单继承问题&lt;/h4&gt;
&lt;p&gt;其实从上面例子就可以看出，一个类可以多个 include 多个模块，并拥有模块的方法，下面这个例子可以更直接看出：&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;例子：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module Mod1
     def meth
       puts "这是Mod1"
     end
   end

   module Mod2
     def meth
       puts "这是Mod2"
     end
   end

   module Mod3
     include Mod2
     include Mod1

     def meth3
       puts "这个Mod3的meth3"
     end
   end

   class ModuleDemo01
     include Mod1
     include Mod3
   end

   mod = ModuleDemo01.new
   mod.meth
   mod.meth3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;输出：&lt;/strong&gt;
这是 Mod1
这个 Mod3 的 meth3&lt;/p&gt;

&lt;hr&gt;

&lt;p&gt;参考来源：《ruby 基础教程》&lt;/p&gt;</description>
      <author>shijin880921</author>
      <pubDate>Tue, 29 Sep 2015 10:20:15 +0800</pubDate>
      <link>https://ruby-china.org/topics/27512</link>
      <guid>https://ruby-china.org/topics/27512</guid>
    </item>
    <item>
      <title>新人学 Ruby --- Ruby 变量</title>
      <description>&lt;h3 id="如有错误望提出。谢谢！"&gt;如有错误望提出。谢谢！&lt;/h3&gt;&lt;h2 id="1.全局变量"&gt;1.全局变量&lt;/h2&gt;
&lt;p&gt;全局变量以&lt;strong&gt;$&lt;/strong&gt;开头，未初始化时默认的值是&lt;strong&gt;nil&lt;/strong&gt;,给全局变量赋值时会改变全局的状态，所以一般不建议使用全局变量。&lt;/p&gt;
&lt;h3 id="例子："&gt;例子：&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="c1"&gt;# 定义一个全局变量$quanju&lt;/span&gt;
&lt;span class="vg"&gt;$quanju&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;BianLiang1&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;print_quanju&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;#$quanju&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;end&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;update&lt;/span&gt;
    &lt;span class="vg"&gt;$quanju&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&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;#$quanju&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;class&lt;/span&gt; &lt;span class="nc"&gt;BianLiang2&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;print_quanju&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;#$quanju&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="k"&gt;end&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;update&lt;/span&gt;
    &lt;span class="vg"&gt;$quanju&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&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;#$quanju&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="n"&gt;bian1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;BianLiang1&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;bian1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print_quanju&lt;/span&gt;
&lt;span class="n"&gt;bian1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;

&lt;span class="n"&gt;bian2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;BianLiang2&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;bian2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print_quanju&lt;/span&gt;
&lt;span class="n"&gt;bian2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;
&lt;span class="n"&gt;bian1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;print_quanju&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="执行结果："&gt;执行结果：&lt;/h3&gt;
&lt;p&gt;打印全局变量值：10
打印修改后的全局变量值：20
打印全局变量值：20
打印修改后的全局变量值：30
打印全局变量值：30&lt;/p&gt;
&lt;h2 id="2.实例变量"&gt;2.实例变量&lt;/h2&gt;
&lt;p&gt;实例变量以&lt;strong&gt;@&lt;/strong&gt;开头。未初始化时默认值是 nul。实例变量是每个实例独有的，不予其它实例共享，既自己改变了，其它实例不受影响。
    实例变量是私有的，无法在类外直接引用，但是可以通过类方法和实例方法访问。&lt;/p&gt;
&lt;h3 id="例子："&gt;例子：&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Variable&lt;/span&gt;
  &lt;span class="vi"&gt;@shili01&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="vi"&gt;@shili02&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;shili&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@shili01&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@shili02&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@shili03&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&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;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@shili01&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@shili02&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;object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Variable&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;object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shili&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"=======分割线======="&lt;/span&gt;
&lt;span class="no"&gt;Variable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="执行结果："&gt;执行结果：&lt;/h3&gt;
&lt;p&gt;30
nil
50
=======分割线=======
10
20&lt;/p&gt;

&lt;p&gt;注意：前后定义的两个&lt;a href="/shili02" class="user-mention" title="@shili02"&gt;&lt;i&gt;@&lt;/i&gt;shili02&lt;/a&gt; 是两个不用的实例变量。第一个是类对象的实例变量，第二个是类的实例对象的实例变量。&lt;/p&gt;
&lt;h2 id="3.类变量"&gt;3.类变量&lt;/h2&gt;
&lt;p&gt;类变量名以 &lt;strong&gt;@@&lt;/strong&gt; 开头，必须初始化才能在方法定义中使用。类变量被这个类所有，实例对象共享。
    类变量是私有的，再类外无法直接访问，可以通过类方法和实例方法访问。&lt;/p&gt;
&lt;h3 id="例子："&gt;例子：&lt;/h3&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Variables&lt;/span&gt;
  &lt;span class="vc"&gt;@@lei&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;
    &lt;span class="vc"&gt;@@lei&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&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;#@@lei&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="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Variables&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;v&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;

&lt;span class="n"&gt;v2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Variables&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;v2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="结果："&gt;结果：&lt;/h3&gt;
&lt;p&gt;类变量值：1
类变量值：2&lt;/p&gt;
&lt;h2 id="4.局部变量"&gt;4.局部变量&lt;/h2&gt;
&lt;p&gt;局部变量以小写字母或者下划线开头。局部变量的作用域从 class、module、def、do 到相应的结尾或者从左大括号到右大括号。
    当调用一个未初始化的局部变量时，它被解释为调用一个不带参数的方法。
    局部变量不可以在内部类或者子类中访问；类中的方法不可以访问该类中定义的局部变量。&lt;/p&gt;</description>
      <author>shijin880921</author>
      <pubDate>Fri, 11 Sep 2015 16:56:43 +0800</pubDate>
      <link>https://ruby-china.org/topics/27288</link>
      <guid>https://ruby-china.org/topics/27288</guid>
    </item>
    <item>
      <title>求教个实例变量的作用域问题</title>
      <description>&lt;h2 id="代码如下："&gt;代码如下：&lt;/h2&gt;&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Variable&lt;/span&gt;
  &lt;span class="vi"&gt;@shili01&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
  &lt;span class="vi"&gt;@shili02&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;

  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;shili&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@shili01&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@shili02&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@shili03&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;50&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;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@shili01&lt;/span&gt;
    &lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="vi"&gt;@shili02&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;object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Variable&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;object&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;shili&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="s2"&gt;"=======分割线======="&lt;/span&gt;
&lt;span class="no"&gt;Variable&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;t&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="输入结果"&gt;输入结果&lt;/h2&gt;
&lt;p&gt;30&lt;/p&gt;

&lt;p&gt;50
=======分割线=======
10
20&lt;/p&gt;
&lt;h2 id="问题"&gt;问题&lt;/h2&gt;
&lt;p&gt;为啥  在方法 shili 中 输出 &lt;a href="/shili02" class="user-mention" title="@shili02"&gt;&lt;i&gt;@&lt;/i&gt;shili02&lt;/a&gt; 时的值是 nil，而再 self.t 方法输出时 &lt;a href="/shili02" class="user-mention" title="@shili02"&gt;&lt;i&gt;@&lt;/i&gt;shili02&lt;/a&gt;的值 是 20？
&lt;a href="/shili02" class="user-mention" title="@shili02"&gt;&lt;i&gt;@&lt;/i&gt;shili02&lt;/a&gt; 是实例变量吧，他的作用域是啥？
Thanks!&lt;/p&gt;</description>
      <author>shijin880921</author>
      <pubDate>Fri, 11 Sep 2015 15:53:44 +0800</pubDate>
      <link>https://ruby-china.org/topics/27286</link>
      <guid>https://ruby-china.org/topics/27286</guid>
    </item>
  </channel>
</rss>
