我刚刚开始学习Ruby,并学会了创建一个类并创建属于该类的对象。我想知道是否有办法检索我在该类中创建的实例的所有名称。 例)
class Clothes
attr_accessor:color
end
shirt=Clothes.new
#=> #<Clothes:0x007f89208cd330>
pants=Clothes.new
#=> #<Clothes:0x007f89208c18f0>
socks=Clothes.new
#=> #<Clothes:0x007f8920861748>
是否有一个命令会按照我给他们的名字列出所有属于衣服(衬衫,裤子,袜子)的物品?谢谢!
答案 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]