Je pensais avoir lu le livre Cherry et le sortir, mais il est difficile de créer un programme par moi-même. .. ..
J'ai rassemblé des ** problèmes de base ** pour ceux qui ont les mêmes problèmes que moi.
Même s'il s'agit d'un problème de base, honnêtement, si vous résolvez ce problème avec de vagues connaissances, vous risquez de ne pas le comprendre.
Si possible, je pense qu'il vaut mieux continuer sans regarder la réponse, mais si vous ne comprenez pas par tous les moyens, j'écrirai la réponse en bas de l'article donc veuillez vous y référer.
Et puisque j'ai moi-même dit que je ne pouvais pas comprendre même si je lisais la réponse, je vais décrire les points que je n'ai pas compris.
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
J'ai fait référence à Problèmes avec cet article.
● <Problème> Lorsque j'exécute le programme ci-dessus, j'obtiens une erreur. Veuillez corriger certaines parties et changer la source afin que la sortie soit comme prévu.
(Production attendue)
-Appeler la méthode d'instance run '' incrémente le compteur partagé de classe de 1. -Appeler la méthode de classe
count`` ``
retourne la valeur actuelle du compteur.
Si 3 est affiché, c'est correct.
●
J'ai cité cet article.
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.
● <Problème> Veuillez changer le code pour que la sortie soit comme commentée.
J'ai fait référence à cet article.
● <Problème> Prédisez le code à écrire dans la classe Rap à partir du résultat de sortie ci-dessous.
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
(Exemple de sortie)
This is mc-battle of Rap
Yo, mic check 1, 2.
Vous ne pouvez pas le résoudre à moins de comprendre comment utiliser les variables de classe et les méthodes de classe.
●
Les articles suivants ont été utiles et très utiles pour résoudre ce problème. https://qiita.com/mogulla3/items/cd4d6e188c34c6819709
Tout d'abord, les points à examiner sont ** 2, 6 lignes **.
sample.rb
class Car
def self.run #2e ligne
@@count += 1
end
def count #6ème ligne
@@count
end
end
car1 = Car.new
car1.run
car2 = Car.new
car2.run
car1.run
puts Car.count
Vous n'avez pas remarqué?
Regardez la dernière ligne.
puts Car.count
Cela semble dépasser la méthode de comptage des classes de voitures, n'est-ce pas étrange?
Lors de l'appel de la classe telle quelle, la méthode de classe doit être émise.
Si vous le réparez
#### **`sample.rb`**
```rb
class Car
def self.run #2e ligne
@@count += 1
end
def self.count #6ème ligne
@@count
end
end
#-Omission-
puts Car.count #Dernière ligne
Et la deuxième ligne est également étrange.
Cela doit être une méthode d'instance.
sample.rb
class Car
def run #2e ligne/def self.Changement de course
@@count += 1
end
end
car1 = Car.new
car1.run
Étant donné que la classe crée une instance avec `` car1 '', il doit s'agir d'une méthode d'instance en tant que méthode pour appeler cette instance.
Mais ce n'est pas la fin.
** La variable de classe `` @@ count '' n'est pas définie. ** **
sample.rb
class Car
@@count = 0 #Définition des variables de classe
def run #Méthode de classe
@@count += 1 #@@count est une variable de classe
end
def self.count #Méthode d'instance
@@count
end
end
car1 = Car.new
car1.run
car2 = Car.new
car2.run
car1.run
puts Car.count
# => $ ruby sample.rb
# => 3
C'est d'accord.
Qu'est-ce qu'une méthode singulière en premier lieu? ** Fait référence à une méthode spécifique à une instance. ** **
Les méthodes singulières peuvent être définies avec
nom d'objet par défaut. Nom de méthode` ``.
https://qiita.com/k-penguin-sato/items/d637dced7af32e4ec7c0
Donc,
food.rb
class Food
def eat
puts "I like."
end
end
natto = Food.new()
wasabi = Food.new()
karaage = Food.new()
#--ajouter à--↓
def wasabi.eat
puts "I don't like."
end
def karaage.eat
puts "I love."
end
#--ajouter à--↑
natto.eat
wasabi.eat
karaage.eat
Définissez des méthodes portant le même nom mais des comportements différents pour les objets qui sont des instances de la même classe.
Il s'agit d'une méthode singulière, qui n'est pas pour la classe, mais pour les instances créées à partir de la classe.
Par conséquent, vous pouvez générer chaque méthode.
(résultat)
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
: Convertit le nom de classe de l'instance elle-même créée comme `` Rap.new '' en une chaîne de caractères.
Maintenant, créons
Rap class` ''.
sample.rb
#--Omission--
class Rap < Music
end
Regardez les caractères de sortie.
Yo, mic check 1, 2.
Puisqu'il s'agit d'une sortie qui n'est pas définie dans la classe Music, nous la sortirons dans la classe Rap.
Si vous regardez `` `Rap.new (" mc-battle "). Mc``` sur la dernière ligne, la méthode utilise` `mc```, donc je vais la décrire.
#### **`sample.rb`**
```rb
#--Omission--
class Rap < Music
def mc
end
end
Puisqu'il hérite de la `` Classe de musique '', si vous décrivez la partie nécessaire
sample.rb
#--Omission--
class Rap < Music
def mc
puts "Yo, mic check 1, 2."
end
end
Mais ce n’est pas la fin.
Nous n'avons pas pu appeler le cours de musique pour le moment.
Que devrais-je faire?
** Exécutez la méthode "super". ** **
La super méthode * trouve et exécute une méthode dans la superclasse qui a le même nom de méthode que la méthode appelée. ** **
Ensuite, si vous réécrivez
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 #Code supplémentaire
puts "Yo, mic check 1, 2."
end
end
Rap.new("mc-battle").mc
terminé.