2009-08-21 5 views
4

http://gist.github.com/172341 (Stackoverflow die Formatierung wurde Brechen)Methoden von attr_accessor erstellt nicht zur Verfügung steht, um Unterklassen

Im folgenden Fall Methodennamen durch menschliche geschaffen ist Boy nicht zur Verfügung. Ist mein Verständnis korrekt, dass attr_accessor Methoden nicht für Unterklassen verfügbar sind. Ich brauche Superklasse, um auf die von attr_accessor hinzugefügte Methode zuzugreifen.

+0

Ich versuchte es nur mich und es funktionierte - die Methode Boy verfügbar war - obwohl natürlich Boy.name nil war seit Boy hatte einen Namen nicht gegeben. Ist das Problem, dass du willst, dass Boy den Namen von Mensch erbt, anstatt einen eigenen Namen zu haben? – Chuck

+2

Das Wesentliche ist nicht mehr verfügbar. – noumenon

Antwort

1

Was Sie suchen ist cattr_accessor, die dieses spezielle Problem behebt:

http://apidock.com/rails/Class/cattr_accessor

Hier ist dein Beispiel festgelegt:

class Human 
    def self.age 
    @age = 50 
    end 
    def self.age=(input) 
    @age = input 
    end 

    cattr_accessor :name 

    self.name = 'human' 
end 
class Boy < Human 
end 

puts Human.age 
puts Boy.age 
puts Human.name 
puts Boy.superclass.name 
puts Boy.name # => 'human' 
+1

'cattr_accessor' macht alle Klassen und Instanzen dieser Klassen den gleichen Wert für die Eigenschaft. Ich bin mir nicht sicher, ob das genau das richtige Verhalten ist. – Chuck

+0

Sie greifen beide auf das gleiche Attribut zu, also macht es Sinn. Wenn Sie einen anderen Wert für die Unterklasse deklarieren möchten, müssen Sie wahrscheinlich den cattr_accessor erneut deklarieren. – tadman

+0

Ich hätte erwähnen sollen, dass ich dieses Problem behoben habe, indem ich cattr_accessor benutzt habe. Allerdings wollte ich wirklich verstehen, wie attr_accessor funktioniert. Mein Verständnis war, dass es eine Instanzvariable speichert. Aber Instant-Variablen sind für Unterklassen verfügbar. Also die wirkliche Frage ist, warum Boy.name Null zurückgibt. Auch warum kann ich nicht den Code-Block dieser Website auf meinem Mac/FF verwenden. – Roger

1

Mensch und Jungen sind zwei verschiedene Objekte. Zwei Objekte können niemals eine einzelne Instanzvariable gemeinsam nutzen. Sie haben beide die Methode, aber die Methode greift auf den entsprechenden Ivar für das Objekt zu.

0

Schienen class_attribute Methode wäre in diesem Fall besser.

Rails Guide

Verwandte Themen