2012-08-12 11 views
35

Proszę, pomóż mi uzyskać wszystkie zmienne instancji zadeklarowane w klasie w ten sam sposób. instance_methods pokazuje mi wszystkie metody dostępne w klasie.Pobierz wszystkie zmienne instancji zadeklarowane w klasie

class A 
    attr_accessor :ab, :ac 
end 

puts A.instance_methods #gives ab and ac 

puts A.something   #gives me @ab @ac... 
+1

wciąż nie mam pojęcia, co ta druga część jest z pytaniem, czy w jaki sposób odnosi się do konieczności, aby wszystkie instancja zmiennych z obiektu. –

+0

Zmienne instancji nie są nigdzie zadeklarowane. To pytanie nie ma sensu. –

+1

Zmienna "nazwa" jest również tworzona dynamicznie. –

Odpowiedz

46

Można użyć instance_variables:

A.instance_variables 

ale to chyba nie to, co chcesz, ponieważ pobiera zmienne instancji w klasaA, a nie instancję tej klasy. Więc prawdopodobnie zechcesz:

a = A.new 
a.instance_variables 

Należy jednak pamiętać, że właśnie dzwoni attr_accessor nie definiuje żadnych zmiennych instancji (to właśnie definiuje metody), więc nie będzie żadnych w instancji dopóki ich jawnie ustawione.

a = A.new 
a.instance_variables #=> [] 
a.ab = 'foo' 
a.instance_variables #=> [:@ab] 
+0

Czy w ruby ​​jest jakakolwiek metoda licząca niezdefiniowane zmienne. Jak podajemy listę w attr_accessor. Więc gdzieś ich wpis został już zrobiony. Dzięki za odpowiedź –

+0

@AkshayVishnoi 'attr_accessor: foo' po prostu generuje' def foo; @bla; end' i 'def foo = (val); @foo = val; koniec'. Nic nie jest przechowywane nigdzie. –

+0

dziękuję za pomoc, ale nadal nie jestem w stanie odpowiedzieć na moje pytanie. Jak sir, jeśli mam klasę "Player" zawierającą nazwę zmiennej. Teraz zainicjowałem 5 obiektów. Teraz, jeśli chcę znaleźć liczbę graczy o nazwie "Ak", to w jaki sposób wygenerowałbym tę funkcję dynamicznie w Module powiedz "MyModule", który jest zawarty w klasie "Player" Dziękuję za współpracę –

6

Jeśli chcesz uzyskać wszystkie instancje zmiennych wartości można spróbować coś takiego:

class A 
    attr_accessor :foo, :bar 

    def context 
    self.instance_variables.map do |attribute| 
     { attribute => self.instance_variable_get(attribute) } 
    end 
    end 
end 

a = A.new 
a.foo = "foo" 
a.bar = 42 
a.context #=> [{ :@foo => "foo" }, { :@bar => 42 }] 
Powiązane problemy