1

新手在这里,很难理解类方法以及为什么我无法在实例中正确显示属性。

class Animal
  attr_accessor :noise, :color, :legs, :arms

  def self.create_with_attributes(noise, color)
    animal = self.new(noise)
    @noise = noise
    @color = color
    return animal
  end

  def initialize(noise, legs=4, arms=0)
    @noise = noise
    @legs = legs
    @arms = arms
    puts "----A new animal has been instantiated.----"
  end
end

animal1 = Animal.new("Moo!", 4, 0)
puts animal1.noise
animal1.color = "black"
puts animal1.color
puts animal1.legs
puts animal1.arms
puts

animal2 = Animal.create_with_attributes("Quack", "white")
puts animal2.noise
puts animal2.color

当我使用类方法create_with_attributes(在animal.2上)时,我希望"white"在我出现时出现puts animal2.color

好像我已经定义了它attr_accessor,就像我有“噪音”一样,但噪音正确出现,而颜色则不会。当我运行这个程序时,我没有收到错误,但是 .color 属性只是没有出现。我相信这是因为我在代码中以某种方式错误地标记了它。

4

2 回答 2

3

self.create_with_attributes是一个类方法,因此在其中设置@noise和设置不是设置实例变量,而是设置所谓的类实例变量@color

你想要做的是在你刚刚创建的实例上设置变量,所以改为self.create_with_attributes看起来像:

 def self.create_with_attributes(noise, color)
     animal = self.new(noise)
     animal.noise = noise
     animal.color = color
     animal
 end

这将在您的新实例上设置属性,而不是在类本身上。

于 2012-04-28T19:02:40.113 回答
1

当您在create_with_attributes方法中时,实例变量是在Animal类本身上设置的,而不是在Animal您刚刚创建的实例上。这是因为该方法在Animal类上(它是 的实例Class),因此它在该上下文中运行,而不是在任何实例的上下文中运行Animal。如果你这样做:

Animal.instance_variable_get(:@color)

运行您描述的方法后,您应该"white"返回。

也就是说,您需要通过调用 setter 方法来设置刚刚创建的实例的属性,如下所示:

def self.create_with_attributes(noise, color)
  animal = self.new(noise)
  animal.color = color
  return animal
end

我删除了 的设置,因为无论如何noise它已经完成了。initialize

于 2012-04-28T19:02:47.583 回答