代码之家  ›  专栏  ›  技术社区  ›  George Mauer

新手总数:ruby中的实例变量?

  •  13
  • George Mauer  · 技术社区  · 16 年前

    #bowling.rb
    
    class Bowling
      @game_score = 0
        def hit(pins)
            @game_score = @game_score + pins
        end
    
        def score
            @game_score
        end
    end
    
    4 回复  |  直到 14 年前
        1
  •  37
  •   Jörg W Mittag    16 年前

    #bowling.rb
    
    class Bowling
      @game_score = 0 # (1)
    

    在这一点上(1),我们仍然在 Bowling 。记住:类和其他类一样,只是对象。因此,此时您正在分配 0 到实例变量 @game_score 类对象的 保龄球 .

     def hit(pins)
      @game_score = @game_score + pins # (2)
    

    现在(2),我们在一个 实例方法 保龄球 保龄球 。那么,现在实例变量 @game_score 属于a 例子 保龄球 类,而不是类本身。

    实例变量从不初始化为任何值,它将计算为 nil (在Ruby中,未初始化的变量总是计算为 ),因此其计算结果为 @game_score = nil + pins #+ 方法,这将导致 NoMethodError

     end
     def score
      @game_score # (3)
    

    在这里(3),我们再次进入一个 实例方法 保龄球 类。这将始终评估为 @game_score .

     end
    end
    

    我们可以使用Ruby的反射功能来查看发生了什么:

    p Bowling.instance_variable_get(:@game_score) # => 0
    b = Bowling.new
    p b.instance_variable_get(:@game_score) # => nil
    

    b.instance_variable_set(:@game_score, 1)
    p b.score # => 1
    b.hit(3)
    p b.score # => 4
    

    所以,我们看到一切都正常工作,我们只需要弄清楚如何确保实例变量被初始化。

    实例方法 被称为 initialize 初始化 是一个实例方法而不是类方法,实际上很简单。Ruby将对象创建分为两个阶段:内存分配和对象初始化。内存分配由 方法已调用 alloc 对象初始化由 例子 方法已调用 初始化 初始化 new 分配 初始化

    class Bowling
     def initialize
      @game_score = 0
     end
    end
    

    c = Bowling.new
    p c.score # => 0
    c.hit(2)
    p c.score # => 2
    

    hit 更习惯的方法是 @game_score += pins .

        2
  •  16
  •   DigitalRoss    16 年前

    def initialize
      @game_score = 0
    end
    

    hit nil .

    如果你现在问 发生了什么 @game_score ? 好吧,永远记住 类是一个对象 对象是一个类 .

    Class .通过分配给 @game_score 类实例变量 Bowling 这些物品一般来说用处不大。(见第1章, 哈尔·富尔顿。)

        3
  •  9
  •   khelll    16 年前

    @game_score 定义为 类实例变量 ,它是为单例类对象定义的变量:

    class << Bowling
      attr_accessor :game_score
    end
    
    Bowling.game_score #=> 0
    

    实例变量 例如定义对象。

        4
  •  0
  •   user187744 user187744    16 年前

    结束