在ruby中获取对象名称

时间:2018-03-05 22:50:39

标签: ruby

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

2 个答案:

答案 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哈希,因此阅读起来会更清晰。