Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将父类初始化变量传递给子类的实例_Ruby_Class_Inheritance_Parent Child - Fatal编程技术网

Ruby 将父类初始化变量传递给子类的实例

Ruby 将父类初始化变量传递给子类的实例,ruby,class,inheritance,parent-child,Ruby,Class,Inheritance,Parent Child,(在Ruby中工作) 首先,我先道歉。我不是一个受过训练的程序员,我只是凭借着便利和不断变化的世界才来到这里的。我需要做的是编程,我厌倦了等待别人为我编程。因此,我错过了一些基本的概念,当我问这些问题时,我有时会因此而出丑 假设我想在类中定义一个物种/工作关系。我想定义一个超类“BlackAnt”,并有子类“Worker”、“Fighter”和“Queen” 在我看来,直觉上,这看起来像这样: class BlackAnt @legs = 6 end class Worker < B

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

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

在我看来,直觉上,这看起来像这样:

class BlackAnt
  @legs = 6
end

class Worker < BlackAnt
  @jaws = 'small'
end
class BlackAnt
  attr_accessor :legs
  @legs = 6

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

newObj = BlackAnt.new
newObj.legs
我犯了一个错误。如果我将BlackAnt类修改为:

class BlackAnt
  attr_accessor :legs
  @legs = 6
end
ant1.legs返回“nil”

我尝试过这里概述的方法:

这允许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
类中的
属性存取器:腿
def初始化
@支腿=6
结束
结束
工人阶级
@强度=1
结束
结果:

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

如下定义BlackAnt类:

class BlackAnt
  attr_accessor :legs

  def initialize
    @legs = 6
  end
end
class Worker < BlackAnt
  attr_accessor :strength

  def initialize
    super

    @strength = 1
  end
end
您的工人阶级如下所示:

class BlackAnt
  attr_accessor :legs

  def initialize
    @legs = 6
  end
end
class Worker < BlackAnt
  attr_accessor :strength

  def initialize
    super

    @strength = 1
  end
end
class Worker
按照当前定义BlackAnt类的方式,您将腿存储为一个

据猜测,这些父变量的值没有得到验证 每次生成新子级时初始化

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

解决“如果它们是变量,则为真”


我不明白你为什么会得到
irb(main):010:0>ant1.legs#=>nil
。对我来说,它是有效的(至少作为脚本)


您的意思是您想要一个已初始化的类实例varieble

所以你可以这样做:

class BlackAnt
  @legs = 6
end

class Worker < BlackAnt
  @jaws = 'small'
end
class BlackAnt
  attr_accessor :legs
  @legs = 6

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

newObj = BlackAnt.new
newObj.legs

谢谢你的回复——不过,这似乎不是解决方案。无法在此处放置代码块,因此我将相应地编辑问题。如果您也向Worker类添加了initialize方法,则需要记住调用super。我编辑我的答案是为了告诉你我的意思,以防出现问题。是的,它现在正在工作,未初始化和初始化。我太累了,不知道为什么未初始化的版本以前不起作用(在“我重新加载它之前忘记按ctrl+s键了”上花了五块钱),所以我会非常感谢你,然后像喝醉的河马一样睡着。我认为这是一个丑陋的方法