2016-11-05 2 views
0

den Code unten gegeben:Zugriff auf Klassenvariablen, können Sie nur eine Setter-Methode ohne Getter-Methode haben?

class Man 
    def self.noise=(noise) 
    @@noise = noise 
    end 
end 

puts Man.noise = ("YO") 

ich die Setter-Methode self.noise verwendet haben, aber die Getter-Methode nicht tatsächlich verwendet und es funktionierte. Ich bin neugierig zu wissen, ob Klassenvariablen erfordert Getter und Setter-Methoden zu arbeiten?

Das verwirrende Element in all dem ist, dass Instanzvariablen scheinen beide Getter-und Setter-Methoden zugegriffen werden müssen. Wenn Sie nur eine Setter-Methode für den Zugriff auf Instanzvariablen haben, wird die Variable einfach nicht zurückgegeben, wenn Sie die Setter-Methode aufrufen.

Meine Frage ist, dass für Klassenvariablen, können Sie nur eine Setter-Methode und rufen Sie es, ohne eine Getter-Methode auf die Klassenvariable zugreifen? In diesem Fall würde die Getter-Methode sein:

self.noise 
    @@noise 
end 
+0

Ist http://Stackoverflow.com/questions/8737421/trying-to-learn-understand-ruby-setter-and-getter-methods - die im Grunde die gleiche Frage, sondern über Instanzvariablen - helfen, Dinge zu klären? Insbesondere Antwort http://stackoverflow.com/a/8737438/117424 kann hilfreich sein. –

+0

Ich verstehe voll und ganz, dass Instanzvariablen beide Getter- und Setter-Methoden verwenden müssen, und fragen sich dasselbe über Klassenvariablen. Ob es notwendig ist, beides zu haben, damit das Programm funktioniert. – developer098

Antwort

2

Sie sind nicht die „Getter“ Methode hier Aufruf seit Man.noise auf der linken Seite des Zuweisungsoperators. Das macht einen Anruf an Man.noise= und Sie haben das definiert.

Wenn Sie es versuchen rufen Sie erhalten diese:

Man.noise 
#! NoMethodError: undefined method `noise' for Man:Class 

Sie können tun, wie diese Dinge, die Ihr Leben leichter zu machen:

class Man 
    class << self 
    attr_accessor :noise 
    end 
end 

Man.noise = 'Hello world!' 
Man.noise 
# => "Hello world!" 

In der Rails-Umgebung Sie cattr_accessor für Klassen und mattr_accessor für Module, die dies für Sie ohne die Notwendigkeit class << self und so tun.

Eine Sache zu beachten ist, wenn möglich, regelmäßige Instanzvariablen zu verwenden. Sie müssen @@ hier nicht verwenden.

+0

Ich verstehe, dass ich eine "Setter" -Methode in diesem Klassenvariablen Fall verwendet habe, aber es scheint ohne die "Getter" -Methode zu funktionieren.Dies wird mit Instanzvariablen verglichen, wobei, wenn ich die "Setter-Methode" direkt ohne eine "Getter" -Methode aufrufen würde, die Instanzvariable nicht zurückgegeben würde. Wollte nur bestätigen, ob ich das richtige Verständnis hatte, dass Sie sowohl Getter- als auch Setter-Methoden nicht benötigen, um auf Klassenvariablen zuzugreifen (in diesem Fall nur Setter), im Gegensatz zu Instanzvariablen. Ist das wahr? – developer098

+0

Es ist ungewöhnlich, nur einen Setter (Mutator) zu haben. Normalerweise erstellen Sie diese paarweise, damit Sie * und * schreiben können. In Ihrem Fall haben Sie nur einen Mutator und keinen Leser definiert. Sie haben also nur die Hälfte der Arbeit erledigt. Es ist im Grunde eine schreibgeschützte Klasseneigenschaft. – tadman

+0

Ich erkenne, dass beide Lese-und Schreibmethoden besser sind. Wollte nur bestätigen, dass Sie für Klassenvariablen (wenn Sie wollten) mit einer Setter-Methode kommen und sie aufrufen, um auf die Klassenvariable zuzugreifen? – developer098

0

Das Schreiben der Klassenvariablen ist korrekt. Sie können sie wie folgt lauten:

class Man 
    def self.noise=(noise) 
    @@noise = noise 
    end 
    def self.noise 
    @@noise ||= nil 
    end 
end 

puts "Hello world!" 
puts Man.noise 
puts Man.noise = ("YO") 
puts Man.noise 

Ausgang:

Hello world! 

YO 
YO 

Allerdings sollten Sie sehr vorsichtig sein, wenn es um die Erbschaft kommt.

class Man 
    def self.noise=(noise) 
    @@noise = noise 
    end 
    def self.noise 
    @@noise ||= nil 
    end 
end 


class Man1 < Man 

end 

Man.noise = ("YO") 
Man1.noise = ("XYZ") 
puts Man1.noise 
puts Man.noise 

Ausgang: ändert sich auch noise der Elternklasse

XYZ 
XYZ 

Beachten Sie, dass noise des Kindes Klasse zu ändern.

Verwandte Themen