2013-02-27 3 views
3

Я только начал изучать Руби сегодня и научился создавать класс и создавать объекты, принадлежащие этому классу. Я хотел бы знать, есть ли способ получить все имена экземпляров, которые я создал в указанном классе. Ex)Листинг имен объекта класса

class Clothes 
    attr_accessor:color 
end 

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

Есть ли команда, которая будет список всех объектов, относящихся к классу одежды (рубашки, брюки, носки) по именам я дал им? Благодаря!

+0

возможно дубликат [Как получить экземпляры класса в Ruby?] (Http://stackoverflow.com/questions/6365638/how-to-get-class-instances-in-ruby) – tokland

+0

Это не dupe, он хочет получить имена переменных, а не все экземпляры класса. –

+0

Если вы нашли, что один из этих ответов особенно полезен, пожалуйста, не забудьте принять ответ. – wvm2008

ответ

2

Отказ от ответственности: что вы пытаетесь сделать, может быть, скорее всего, решить гораздо более элегантно.

Я бы просто сохранил объекты, которые хочу запомнить в массиве. Тем не менее, вот решение на ваш вопрос:

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

это замечательно. +1 для этого – AnkitG

+0

Это сработало, спасибо padde! – zmerilla

+0

, и мне не пришлось менять переменные на переменные экземпляра, что удобно. – zmerilla

0

Нет, нет. Однако вы можете добиться чего-то подобного, изменив метод new, чтобы он сохранял все новые экземпляры этого класса в переменной класса. Это даст вам легкий доступ ко всем объектам этого класса, но не к именам переменных (для которых я действительно не могу найти нужды)

+1

вы можете перебирать объекты 'Одежда' с помощью' ObjectSpace.each_object (Clothes) ', но я не думаю, что вы действительно можете делать то, что хочет OP. – Kyle

+0

Я только начинаю, поэтому у меня нет необходимости в чем-либо, что я делаю, хаха, просто пытаясь выучить язык. Спасибо за ваш вклад. – zmerilla

0

Вы можете использовать ruby ​​ObjectSpace для сбора всех экземпляров/объектов класса each_object метод поможет вам сделать этот

Е.Г.

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

он вернет все * экземпляры *, но не * имена переменных * –

+0

@padde да, он вернет все объекты, которые он попросил. Если он хочет иметь одежду, может быть, он должен инкапсулировать и сделать атрибут типа ткани. – AnkitG

+0

Хорошо спасибо ankit. @padde из того, что я понимаю, читаю предыдущие сообщения, то, что я прошу, невозможно, и это не очень полезно. Я только начинаю, поэтому у меня нет реальной цели, просто пытаюсь разобраться в этом. – zmerilla

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] 
+0

Это работало благодаря тонне! – zmerilla

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 
+0

Humm ,, довольно приятно :) '+ 1'. –

Смежные вопросы