class Animal
def initialize(noise)
@noise = noise
end
def say
puts "#{self.class} does #{@noise}"
end
end
dog = Animal.new("Woof Woof")
cat = Animal.new("Meow Meow")
dog.say
cat.say
如何打印dog does woof woof
代替Animal does Woof Woof
?
答案 0 :(得分:4)
要清楚,Animal是您创建的类的名称。这就是为什么当你
puts " #{self.class} etc... "
文本Animal出现。
现在在你的例子中,cat和dog是变量的名称。这些只不过是对您在行中创建的对象的引用:
dog = Animal.new("Woof Woof")
cat = Animal.new("Meow Meow")
该变量可能被称为狗或猫,但该类仍然是动物。据我所知,没有好的方法来获取变量的名称,缺少一些非常复杂的内省工具。
另一方面:如果您只想让您的动物拥有名字,请考虑添加名称属性。
class Animal
def initialize(name, noise)
@name = name
@noise = noise
end
def say
puts "#{@name} does #{@noise}"
end
end
dog = Animal.new("Dog", "Woof Woof")
cat = Animal.new("Cat", "Meow Meow")
dog.say
cat.say
答案 1 :(得分:1)
这是一个代码误解,没什么大不了的。 Animal
是对象,这就是它始终打印Animal does Woof Woof
的原因。您知道Animal
是对象,因为您已声明它:class Animal
,类是对象。
dog
是该Animal
类的一个实例。如果要打印实例名称,则需要实际创建属性,就像使用@noise
一样。所以,一个例子可能是:
def initialize(noise, name)
@noise = noise
@name = name
end
dog = Animal.new("Woof Woof", "dog")
请注意,您可能不希望单独传递params
,而是传递params
哈希,因此阅读起来会更清晰。