Ich setze einen Trace-Code in meinem Programm und würde gerne wissen, welche Methoden durch attr_accessor
definiert sind. Mit TracePoint
kann ich erkennen, wenn attr_accessor
aufgerufen wird, aber ich weiß nicht, wie man es bekommt, um mir die Argumente zu nennen, die es erhielt. Irgendwelche Ideen?Alle durch 'attr_accessor` definierten Variablen ohne Überschreiben `attr_accessor`
Antwort
Sie können obj.methods()
verwenden, um alle verfügbaren Methoden für die Instanz zu finden (inc-Methoden von Superklassen), und obj.methods(false)
, um nur die für das aktuelle Singleton-Objekt definierte Methode zu ermitteln. Ich bin nicht sicher, ob es möglich ist zu erkennen, ob diese Methoden erstellt wurden über attr_accessor
, obwohl
Dann beantwortet das nicht wirklich die Frage, oder? :) –
In der Frage Titel, Sie nach einer Liste von Variablen gefragt, aber dies beantwortet den Fragenkörper, der für eine Liste der definierten Methoden fragte .
Diese Methode überprüft nicht die Instanzvariablen, bei denen Rauschen auftritt, wenn Sie mit der manuellen Aktualisierung oder dem Erstellen anderer Instanzvariablen beginnen.
module MethodTracer
TracePoint.trace(:c_call) do |t|
if (t.method_id == :attr_accessor)
t.self.extend(MethodTracer)
methods = t.self::Methods ||= []
MethodTracer.send(:define_method, :method_added) {|m| methods << m }
end
end
TracePoint.trace(:c_return) do |t|
if (t.method_id == :attr_accessor)
MethodTracer.send(:remove_method, :method_added)
end
end
end
class Foo
attr_accessor :a, :b
attr_accessor :c
def foo; end
end
Foo::Methods # => [:a, :a=, :b, :b=, :c, :c=]
Ich habe die Methodennamen in der Methods
Konstante gespeichert, aber natürlich können Sie sie speichern, wo auch immer für Sie am bequemsten ist.
Definieren/Entfernen method_added
auf MethodTracer
sorgt dafür, dass Sie nicht Foo.method_added
Sie selbst definiert haben klobber. Diese Methode erfordert jedoch, dass Sie, wenn Sie Foo.method_added
vor Ihren Anrufen zu attr_accessor
definieren, müssen Sie super
darin aufrufen. Andernfalls überspringen Sie das temporäre method_added
definiert durch MethodTracer
.
Dies scheint die einzig richtige Antwort zu sein. – sawa
Als eine Randnotiz habe ich einige Zeit damit verbracht, herauszufinden, wie man 'TracePoint' benutzt, um die Namen der Methoden zu erhalten, die an 'attr_accessor' übergeben werden. Ich fand es ziemlich unmöglich. –
Ich habe versucht. Und auch das OP. Das war der springende Punkt der Frage. Und nur du hast die Lösung erreicht. – sawa
- 1. Nicht-Datenbankattribut für Schienenmodell ohne 'attr_accessor' setzen
- 2. Get attr_accessor/Instanzvariablen in Ruby
- 3. Attr_accessor in Node-Klasse
- 4. attr_accessor für Array?
- 5. Dynamisch Klassenattribute mit attr_accessor erstellen
- 6. Verwendung von attr_accessor in Rails
- 7. Unterschied zwischen @instance_variable und attr_accessor
- 8. Benötigt attr_accessor die Verwendung von Symbolen als Variablen in Ruby?
- 9. Ruby attr_accessor: Name zu: Name [] Array
- 10. Ruby + Rspec: Wie soll ich attr_accessor testen?
- 11. Warum ist attr_accessor in Rails erforderlich?
- 12. Verwenden Sie attr_accessor, um Navigationsfeld Wert
- 13. Erstellt Rubys attr_accessor automatisch Instanzvariablen für Attribute?
- 14. attr_accessor, der beim Schreiben nil in string umwandelt
- 15. Methoden von attr_accessor erstellt nicht zur Verfügung steht, um Unterklassen
- 16. Wie bekomme ich die Suche, um den attr_accessor zu verwenden?
- 17. Warum kann ich attr_accessor nicht innerhalb von initialize verwenden?
- 18. Ruby Attr_accessor vs. Getter/Setter Benchmark: Warum ist Accessor schneller?
- 19. Kann keine Massen assign geschützten Attribute attr_accessor und attr_accessible
- 20. attr_accessor nicht in Mailer bei der Verwendung von deliver_later
- 21. attr_accessor und eine Methode initialize in einer Klasse Vermengung
- 22. Alle definierten MSBuild-Variablen auflisten - Entspricht
- 23. ActiveRecord setzt alle meine vorher definierten Variablen zurück
- 24. Anzeige aller aktuell definierten Variablen
- 25. Sass Variablen in Print Stylsheet überschreiben Variablen in "alle" Stylesheet
- 26. Wie listet ich alle definierten Variablen in einem groovigen Skript
- 27. Wenn attr_accessor ein Element enthält, z. ': name', braucht man die 'name =' Methode?
- 28. Wie kann Rubys attr_accessor Klassenvariablen oder Klasseninstanzvariablen anstelle von Instanzvariablen erzeugen?
- 29. Modell fehlt erforderlich attr_accessor für 'photo_file_name' beim Hochladen mit Büroklammer und S3 auf heroku
- 30. Schleifen durch Elemente eines definierten Betontyps?
Sie können _all_ Instanzvariablen abrufen. Wenn das nicht gut genug ist, müssen Sie attr_accessor auf die eine oder andere Weise instrumentieren. Keine Möglichkeit, das zu vermeiden. –
Ist es wichtig, ob die Methode mit 'attr_accessor' definiert wurde oder Sie nach Methoden suchen, die Accessormethoden von Instanzvariablen sind? –
attr_accessor ist, was ich suche. Den Rest kann ich einfach mit TracePoint bekommen. –