在ruby中获取对象名称

问题描述 投票:1回答:2
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

ruby
2个回答
4
投票

要清楚,Animal是您创建的类的名称。这就是为什么当你

puts " #{self.class} etc... "

动物文字出现了。

现在在你的例子中,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
投票

这是一个代码误解,没什么大不了的。 Animal是对象,这就是为什么它总是打印Animal does Woof Woof。你知道Animal是对象,因为你已经声明了它:class Animal,一个类是一个对象。

dogAnimal类的一个例子。如果要打印实例名称,则需要实际创建属性,就像使用@noise一样。所以,一个例子可能是:

def initialize(noise, name) 
  @noise = noise
  @name = name
end

dog = Animal.new("Woof Woof", "dog")

请注意,您可能不希望单独传递params,而是使用params哈希,因此阅读起来会更清晰。

© www.soinside.com 2019 - 2024. All rights reserved.