加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

总新手:红宝石中的实例变量?

发布时间:2020-12-16 20:09:25 所属栏目:百科 来源:网络整理
导读:赦免总的newbiew问题,但为什么@game_score总是没有? #bowling.rbclass Bowling @game_score = 0 def hit(pins) @game_score = @game_score + pins end def score @game_score endend 解决方法 我们来看看代码,我们呢? #bowling.rbclass Bowling @game_scor
赦免总的newbiew问题,但为什么@game_score总是没有?
#bowling.rb

class Bowling
  @game_score = 0
    def hit(pins)
        @game_score = @game_score + pins
    end

    def score
        @game_score
    end
end

解决方法

我们来看看代码,我们呢?
#bowling.rb

class Bowling
  @game_score = 0 # (1)

在这一点(1),我们仍然在班级保龄球.记住:类只是像其他任何对象.因此,在这一点上,您将0分配给类对象Bowling的实例变量@game_score.

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

现在(2),我们是保龄球课的一个实例方法.即:这是一种属于保龄球实例的方法.所以,现在实例变量@game_score属于Bowling类的一个实例,而不是类本身.

由于这个实例变量从来没有被初始化为任何东西,所以它将评估为nil(在Ruby中,未初始化的变量总是计算为nil),所以这个评估结果为@game_score = nil引脚,并且由于没有#方法,这将导致在引发的NoMethodError异常中.

end
 def score
  @game_score # (3)

在这里(3),我们再次进入保龄球课的一个实例方法.这将总是评估为零,原因如上:@game_score从未初始化,因此评估为nil.

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的类方法完成,对象初始化由一个称为initialize的实例方法(Objective-C程序员会认识到这一点).alloc是一个类方法的原因只是在执行的这一点上还没有实例,初始化的一个实例方法是对象初始化显然是每个对象,为了方便起见,有一个称为new的标准工厂类方法,它为您调用alloc和initialize.)

class Bowling
 def initialize
  @game_score = 0
 end
end

我们来测试一下:

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

BTW:只是一些小的Ruby样式提示:缩进是2个空格,而不是1个选项卡.而你的命中方法将会更加惯用@game_score =引脚.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读