Ich dachte, ich würde das Cherry-Buch lesen und es ausgeben, aber es ist schwierig, selbst ein Programm zu erstellen. .. ..
Ich habe ** Grundprobleme ** für diejenigen gesammelt, die die gleichen Probleme haben wie ich.
Selbst wenn es sich um ein Grundproblem handelt, können Sie es möglicherweise nicht verstehen, wenn Sie dieses Problem mit vage Kenntnissen lösen.
Wenn möglich, denke ich, ist es besser, fortzufahren, ohne auf die Antwort zu schauen, aber wenn Sie nicht auf alle Fälle verstehen, werde ich die Antwort am Ende des Artikels schreiben, also beziehen Sie sich bitte darauf.
Und da ich selbst sagte, dass ich selbst nach dem Lesen der Antwort nicht verstehen konnte, werde ich die Punkte beschreiben, die ich nicht verstanden habe.
sample.rb
class Car
def self.run
@@count += 1
end
def count
@@count
end
end
car1 = Car.new
car1.run
car2 = Car.new
car2.run
car1.run
puts Car.count
Ich habe auf [Probleme mit diesem Artikel] verwiesen (https://www.oiax.jp/rails/ruby-ex/class_variable_and_class_method.html).
●
(Erwartete Ausgabe) -Das Aufrufen der Instanzmethode `` `run``` erhöht den gemeinsam genutzten Klassenzähler um 1.
`count
`aufrufen, wird der aktuelle Zählerwert zurückgegeben.Wenn 3 angezeigt wird, ist es in Ordnung.
●
Ich habe [diesen Artikel] zitiert (http://www.minituku.net/courses/500228005/contents/228585781.html).
food.rb
class Food
def eat
puts "I like."
end
end
natto = Food.new()
wasabi = Food.new()
karaage = Food.new()
natto.eat #=>I like.
wasabi.eat #=>I don't like.
karaage.eat #=>I love.
●
Ich habe auf [diesen Artikel] verwiesen (http://www.minituku.net/courses/500228005/contents/767771771.html).
●
sample.rb
class Music
def mc
puts "This is #{@genre} of #{self.class.to_s}"
end
def initialize(genre)
@genre = genre
end
end
Rap.new("mc-battle").mc
(Ausgabebeispiel)
This is mc-battle of Rap
Yo, mic check 1, 2.
Sie können es nur lösen, wenn Sie verstehen, wie Klassenvariablen und Klassenmethoden verwendet werden.
●
--Klassen und ihre Instanzen haben einen Gültigkeitsbereich
Die folgenden Artikel waren hilfreich und sehr hilfreich bei der Lösung dieses Problems. https://qiita.com/mogulla3/items/cd4d6e188c34c6819709
Zuallererst sind die zu betrachtenden Punkte ** 2, 6 Linien **.
sample.rb
class Car
def self.run #2. Zeile
@@count += 1
end
def count #6. Zeile
@@count
end
end
car1 = Car.new
car1.run
car2 = Car.new
car2.run
car1.run
puts Car.count
Hast du es nicht bemerkt?
Schauen Sie sich die letzte Zeile an.
puts Car.count
Dies scheint die Methode zur Zählung der Fahrzeugklasse zu überhängen, ist das nicht seltsam?
Beim Aufruf der Klasse muss die Klassenmethode ausgegeben werden.
Wenn Sie es beheben
#### **`sample.rb`**
```rb
class Car
def self.run #2. Zeile
@@count += 1
end
def self.count #6. Zeile
@@count
end
end
#-Unterlassung-
puts Car.count #Letzte Linie
Und die zweite Zeile ist auch seltsam.
Dies muss eine Instanzmethode sein.
sample.rb
class Car
def run #2. Zeile/def self.Wechsel vom Lauf
@@count += 1
end
end
car1 = Car.new
car1.run
Da die Klasse eine Instanz mit `` `car1``` erstellt, muss es sich um eine Instanzmethode handeln, um diese Instanz aufzurufen.
Aber das ist nicht das Ende.
** Die Klassenvariable `` `@@ count``` ist nicht definiert. ** **.
sample.rb
class Car
@@count = 0 #Definition von Klassenvariablen
def run #Klassenmethode
@@count += 1 #@@count ist eine Klassenvariable
end
def self.count #Instanzmethode
@@count
end
end
car1 = Car.new
car1.run
car2 = Car.new
car2.run
car1.run
puts Car.count
# => $ ruby sample.rb
# => 3
Das ist okay
Was ist überhaupt eine singuläre Methode? ** Bezieht sich auf eine instanzspezifische Methode. ** **.
Singuläre Methoden können mit `def Objektname definiert werden. Methodenname
`.
https://qiita.com/k-penguin-sato/items/d637dced7af32e4ec7c0
Deshalb,
food.rb
class Food
def eat
puts "I like."
end
end
natto = Food.new()
wasabi = Food.new()
karaage = Food.new()
#--hinzufügen--↓
def wasabi.eat
puts "I don't like."
end
def karaage.eat
puts "I love."
end
#--hinzufügen--↑
natto.eat
wasabi.eat
karaage.eat
Definieren Sie Methoden mit demselben Namen, aber unterschiedlichem Verhalten für Objekte, die Instanzen derselben Klasse sind.
Dies ist eine singuläre Methode, die nicht für die Klasse gilt, sondern für die aus der Klasse erstellten Instanzen.
Daher können Sie von jeder Methode ausgeben.
(Ergebnis)
I like.
I don't like.
I love.
sample.rb
class Music
def mc
puts "This is #{@genre} of #{self.class.to_s}"
end
def initialize(genre)
@genre = genre
end
end
Rap.new("mc-battle").mc
- Self.class.to_s
: Konvertiert den Klassennamen der Instanz selbst, die wie `` `Rap.new``` erstellt wurde, in eine Zeichenfolge.
Jetzt erstellen wir eine Rap-Klasse.
sample.rb
#--Unterlassung--
class Rap < Music
end
Schauen Sie sich die Ausgabezeichen an.
Yo, mic check 1, 2.
Da es sich um eine Ausgabe handelt, die nicht in der Music-Klasse definiert ist, geben wir sie in der Rap-Klasse aus.
Wenn Sie sich `` `Rap.new (" mc-Battle "). Mc``` in der letzten Zeile ansehen, verwendet die Methode` `` mc```, also werde ich es beschreiben.
#### **`sample.rb`**
```rb
#--Unterlassung--
class Rap < Music
def mc
end
end
Da erbt die Musikklasse, wenn Sie den notwendigen Teil beschreiben
sample.rb
#--Unterlassung--
class Rap < Music
def mc
puts "Yo, mic check 1, 2."
end
end
Dies ist jedoch nicht das Ende.
Wir konnten die Musikklasse zu diesem Zeitpunkt noch nicht anrufen.
Was soll ich machen?
** Führen Sie die "Super" -Methode aus. ** **.
Die Supermethode * findet und führt eine Methode in der Oberklasse aus, die denselben Methodennamen wie die aufgerufene Methode hat. ** **.
Dann, wenn Sie neu schreiben
sample.rb
class Music
def mc
puts "This is #{@genre} of #{self.class.to_s}"
end
def initialize(genre)
@genre = genre
end
end
class Rap < Music
def mc
super #Zusätzlicher Code
puts "Yo, mic check 1, 2."
end
end
Rap.new("mc-battle").mc
erledigt.
Recommended Posts