2012-12-23 119 views
3

(在Ruby中工作) 首先,我提前道歉。我不是一个训练有素的程序员,我只是靠着方便和不断变化的世界来达到目的。我需要做的事情包括编程,我厌倦了等待别人为我编程。因此,我一路上错过了一些基本概念,当我提出这些问题时,我有时会因此而自欺欺人。将父类初始化变量传递给子类的实例

比方说,我想要定义一个类别中的物种/工作关系。我想定义一个超类“BlackAnt”,并有子类“工人”,“战斗机”和“皇后”

对我来说,直觉,这看起来是这样的:

class BlackAnt 
    @legs = 6 
end 

class Worker < BlackAnt 
    @jaws = 'small' 
end 

但如果我再试试

ant1 = Worker.new 
puts ant1.legs 

我得到一个错误。如果我修改类BlackAnt到:

class BlackAnt 
    attr_accessor :legs 
    @legs = 6 
end 

ant1.legs返回 '零'

我试着概括的方法在这里:http://railstips.org/blog/archives/2006/11/18/class-and-instance-variables-in-ruby/

,这允许Worker.legs回到 '6' ,但是......唉:

ant1 = Worker.new 
Worker.legs => '6' 
ant1.legs => 'nil' 

在猜测,这些家长变量的值不被每一个新的孩子产生了时间的初始化。

我觉得我对此有点无聊,而且回复毫无疑问会让我发现我发现咖啡因驱动的全能者的那一天。我需要做的就是安排的事情,这样我可以像这样创建对象:

ant1 = Worker.new 
ant2 = Queen.new 
ant3 = Fighter.new 

,并让他们每个获得的腿适当数量的,与任何特殊特性在子类中被分配一起。工人/女王/战斗机的分类将在命名空间的约束,使得实际的调用将是:

ant1 = AntBlack::Worker.new 
ant2 = AntRed::Worker.new 
ant3 = AntRed::Queen.new 

我想,然后能够检查个人的腿的数量蚂蚁使用:

ant1.legs #=> 6 

我可能会绕着我的胳膊肘到达我的拇指。如果是这样,随时提供替代方法来达到同样的结果,我将非常感谢这些见解。

///更新重:响应///

class AntRed 
    attr_accessor :legs 
    def initialize 
    @legs = 6 
    end 
end 

class Worker < AntRed 
    @strength = 1 
end 

结果:

irb(main):009:0> ant1 = Worker.new 
#=> #<Worker:0x87616ac @strength=1> 
irb(main):010:0> ant1.legs 
#=> nil 

回答

4

定义你的BlackAnt类,如下所示:

class BlackAnt 
    attr_accessor :legs 

    def initialize 
    @legs = 6 
    end 
end 

而且你的Worker类如下:

class Worker < BlackAnt 
    attr_accessor :strength 

    def initialize 
    super 

    @strength = 1 
    end 
end 

您当前定义BlackAnt类的方式是,将腿存储为class level instance variable

+0

感谢您的答复 - 这不,但是,似乎是分辨率。不能在这里放置代码块,所以我会相应地编辑问题。 –

+0

如果您还为Worker类添加了初始化方法,则需要记得调用super。我编辑了我的答案,告诉你我的意思是否是这个问题。 – cbascom

+2

对,它现在正在工作,都未初始化和初始化。我太累了,不知道为什么这个未初始化的版本以前没有工作(在我重新加载之前,我忘记点击ctrl + s的五块钱),所以我只会非常感谢你,并像醉酒的河马一样入睡。 。 –

0

在猜测,这些父变量的值不是 初始化每次一个新的孩子被产生。

在Ruby中,实例变量属于单个对象。看看我的答案7点)开始

为了解决您的“如果属实,他们是变量”

Why are symbols in Ruby not thought of as a type of variable?


我不明白为什么你irb(main):010:0> ant1.legs #=> nil。对我来说它起作用(至少作为脚本)。

class AntRed 
    attr_accessor :legs 
    def initialize 
    @legs = 6 
    end 
end 

class Worker < AntRed 
end 

ant1 = Worker.new 
print 'ant1.legs : '; puts ant1.legs 

执行:

$ ruby -w test.rb 
ant1.legs : 6 
0

你的意思是你想要的已经草签一个类的实例varieble!

所以你可以做这样的:

class BlackAnt 
    attr_accessor :legs 
    @legs = 6 

    def initialize 
    @legs = self.class.instance_variable_get(:@legs) 
    end 
end 

newObj = BlackAnt.new 
newObj.legs 
+0

我认为这是一种丑陋的方法 – user1933562