3

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

class Clothes
  attr_accessor:color
end

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

是否有一个命令可以按我给它们的名称列出属于 Clothes 类(衬衫、裤子、袜子)的所有对象?谢谢!

4

5 回答 5

2

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

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

local_variables.select{|v| eval(v.to_s).class == Clothes }
#=> [:socks, :pants, :shirt]
于 2013-02-27T21:13:50.050 回答
1

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

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
于 2013-02-27T21:55:24.693 回答
0

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

于 2013-02-27T21:02:30.117 回答
0

您可以使用 ruby​​ ObjectSpace收集类的所有实例/对象,each_object方法将帮助您做到这一点

例如

all = []
ObjectSpace.each_object Clothes {|cloth| all << cloth }
于 2013-02-27T21:04:54.633 回答
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]
于 2013-02-27T21:13:57.373 回答