Klassen, Module und die Klassen-Selbst-Methode nicht verstehen

8

Ich habe den folgenden Code:

%Vor%

Wenn ich die Methode myfunction so aufrufe, funktioniert es gut:

%Vor%

Aber wenn ich class << self entfernt habe und% self. ein Präfix% co_de hinzugefügt habe, funktioniert es nicht.

Zum Beispiel:

%Vor%

Ich versuche die Methode myfunction zu verstehen. Ich dachte, es wäre eine Möglichkeit, das class << self Präfix allen Methoden hinzuzufügen, aber wenn das stimmt, warum funktioniert es dann nicht, wenn ich es entferne und jeder Methode manuell self. voranstelle?

Vielen Dank im Voraus für Ihre Hilfe.

    
Nathan 27.03.2012, 23:59
quelle

2 Antworten

7

Dies liegt daran, dass Ihr attr_accessor :first_name auch von class << self umschlossen ist.

Um es so zu machen, wie Sie es vorschlagen, können Sie mattr_accessor so verwenden:

%Vor%     
jnevelson 28.03.2012, 00:12
quelle
4

Um besser zu verstehen, wie Sie erreichen können, was Sie wollen, sehen Sie sich das folgende Beispiel an:

%Vor%

Ich hoffe, es ist jetzt klarer, beachte, dass dies nur eine Möglichkeit ist (es gibt andere).

UPDATE: Ich werde versuchen, genauer zu sein. Wenn Sie Instanz- / Singleton-Methoden auf dem Modul definieren, tun Sie tatsächlich, dass Sie Instanzmethoden der Klasse definieren, die dieses Modul enthalten, und auf der anderen Seite Klassenmethoden, die auf dem Modul definiert sind, zu Klassenmethoden dieses Moduls werden. Der zweite Gedanke ist, dass attr_accessor Instanz-Methode für Getter und Setter des gegebenen Parameters erstellt.

Um nun einen Teil Ihrer Frage zu beantworten, erstellen Sie im ersten Beispiel 3 Klassenmethoden in der Klasse des Moduls. Im zweiten Fall erstellen Sie eine Klassenmethode, bei der Sie versuchen, auf eine andere Klassenmethode (Setter) zuzugreifen, aber Ihre Getter und Setter sind als Instanzmethoden definiert = sie werden Instanz der Methode der Klasse, die Ihr Modul, Sie, enthält kann nicht auf diese Weise zu ihnen gelangen = Sie haben keinen Zugang zu Ihren Gettern und Setter. Was die Erklärung des Selbst betrifft, bin ich nicht so geschickt, aber soweit ich weiß, wenn Sie "class & lt; & lt; self" verwenden, öffnen Sie die Eigenklasse des Objektes (jedes Objekt hat eine eigene) Diese Klasse, Module oder Instanzen von Klassen sind natürlich auch Objekte, in denen Sie Instanzmethoden definieren. Klassenmethode des Objekts in Ruby = Instanzmethode der Eigenklasse des Objekts. So können Sie dies zum Beispiel tun:

%Vor%

Wenn Sie eine Instanz der Klasse erstellen (String in diesem Beispiel), erhält diese Instanz ihre eigene eindeutige anonyme Klasse, die eine Unterklasse dieser Klasse ist. Im Beispiel haben Sie die Instanzmethode für die Eigenklasse der anonymen Unterklasse der String-Klasse definiert. Sie können also die Methode "say_hi" für das Textobjekt, nicht aber für die String-Klasse verwenden. Also "Klasse & lt; selbst" öffnet diese Eigenklassen.

Andererseits repräsentiert "self" alleine nur ein Objekt im aktuellen Kontext, was in einigen Szenarien dasselbe bedeutet (zum Beispiel deins). Wie bei der self.included-Methode ist es nur eine Callback-Methode, die aufgerufen wird, wenn das Modul in der Klasse mit einem Parameter enthalten ist, der das Objekt repräsentiert (hier die Klasse SomeObject).

Ich hoffe, dass ich zumindest einen Teil Ihrer Frage beantwortet habe. Mehr Informationen hier: Unterschied zwischen 'self.method_name' und 'class & lt; & lt; Selbst 'in Ruby

    
Giron 28.03.2012 00:36
quelle

Tags und Links