3

(在 Ruby 中工作)首先,我提前道歉。我不是受过培训的程序员,我只是凭借方便和不断变化的世界来到这里。我需要做的是编程,我厌倦了等待别人为我编程。因此,我在此过程中错过了一些基本概念,当我问这些问题时,我有时会因此出丑。

假设我想在类中定义物种/工作关系。我想定义一个超类“BlackAnt”并有子类“Worker”“Fighter”和“Queen”

对我来说,直观地说,这看起来像这样:

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

并让他们每个人获得适当数量的腿,以及在子班中分配的任何特殊特征。worker/queen/fighter 分类将由命名空间绑定,因此实际调用将是:

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

3 回答 3

5

如下定义您的 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 类的方式是将腿存储为类级实例变量

于 2012-12-23T04:26:10.770 回答
0

猜测一下,这些父变量的值不会在每次产生新子代时被初始化。

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

解决您的“如果它们是变量”的问题

为什么 Ruby 中的符号不​​被认为是一种变量?


我不明白你为什么得到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
于 2012-12-23T07:56:47.347 回答
0

你的意思是你想要一个已经初始化的类的实例变量!

所以你可以这样做:

class BlackAnt
  attr_accessor :legs
  @legs = 6

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

newObj = BlackAnt.new
newObj.legs
于 2012-12-28T07:41:34.477 回答