列出类对象的名称

时间:2013-02-27 20:53:58

标签: ruby class object

我刚刚开始学习Ruby,并学会了创建一个类并创建属于该类的对象。我想知道是否有办法检索我在该类中创建的实例的所有名称。 例)

class Clothes
  attr_accessor:color
end

shirt=Clothes.new
#=> #<Clothes:0x007f89208cd330> 
pants=Clothes.new
#=> #<Clothes:0x007f89208c18f0> 
socks=Clothes.new
#=> #<Clothes:0x007f8920861748> 

是否有一个命令会按照我给他们的名字列出所有属于衣服(衬衫,裤子,袜子)的物品?谢谢!

5 个答案:

答案 0 :(得分:2)

免责声明:您尝试做的事情很可能更优雅地解决。

我只是将想要记住的对象存储在一个数组中。不过,这是您问题的解决方案:

local_variables.select{|v| eval(v.to_s).class == Clothes }
#=> [:socks, :pants, :shirt]

答案 1 :(得分:1)

我建议使用类变量来收集所有实例的名称,并在initialize方法中传递某种符号。

class Clothes
    attr_accessor :color

    @@instances = []
    def initialize(name)
        @@instances << name
    end

    def all
       puts @@instances
    end
end

shirt = Clothes.new(:shirt)
pants = Clothes.new(:pants)

puts pants.all
# outputs the names

答案 2 :(得分:0)

不,没有。但是,您可以通过修改new方法来实现类似的操作,以便将此类的所有新实例存储在类变量中。这将使您可以轻松访问此类的所有对象,但不能访问变量名称(无论如何我无法真正找到它)

答案 3 :(得分:0)

您可以使用ruby ObjectSpace来收集类的所有实例/对象each_object方法将帮助您执行此操作

例如

all = []
ObjectSpace.each_object Clothes {|cloth| all << cloth }

答案 4 :(得分:0)

您可以使用实例变量:

class Clothes; end
@a = Clothes.new
@b = Clothes.new
@c = 1

p instance_variables.select{|v|instance_variable_get(v).class == Clothes}
#=>[:@a, :@b]