Quelle est la gamme d'influence de l'héritage pendant le travail? .. Et Que signifie soi-même dans ce cas? .. Et Je ne pouvais comprendre que la partie de base moelleuse, alors cette fois
--Classe --Héritage - self --Nid
J'ai appris en écrivant, donc je vais l'écrire comme un disque. J'aimerais écrire sur les méthodes et les variables, mais j'aimerais les écrire séparément car cela semble long.
Vous pouvez spécifier une superclasse lors de la définition de la classe, S'il n'est pas spécifié à ce stade, la classe d'objets est automatiquement héritée. Par conséquent, chaque fois qu'une nouvelle classe est définie, elle hérite d'une classe. Ce sera toujours quelque part dans l'arbre d'héritage.
--Méthode de classe super classe
De plus, bien qu'il ne soit pas hérité, vous pouvez également faire référence aux constantes de superclasse et aux variables de classe.
class Klass
VALUE = "I'm VALUE"
@@class_val = "I'm class_val"
end
class A < Klass
end
class B < A
def self.display_bal
puts @@class_val
end
end
#Référence aux constantes de superclasse
puts B::VALUE
# => I'm VALUE
#Héritage des variables de classe
B.display_val
# => I'm class_val
self
Puisque self
fait référence à l'objet lui-même, le contenu changera en fonction de l'endroit où vous l'utilisez.
Dans l'exemple ci-dessous, nous avons pointé vers l '«objet instance» uniquement lorsqu'il est utilisé dans une méthode d'instance. De plus, puisque «self» utilisé lors de la définition d'une méthode de classe fait référence à un objet de classe Vous pouvez également spécifier le "self" du "self. Method name" directement dans le nom de la classe.
class Klass
# Klass
p self
# Klass
def (p self).class_method
puts "inner_class_method"
# Klass
p self
end
def instance_method
puts "inner_instance_method"
# <Klass:0x00007fa07e1a47c8>
p self
end
end
Klass.class_method
klass_instanse = Klass.new
klass_instanse.instance_method
Lors de la définition d'une classe, vous pouvez l'imbriquer dans d'autres classes. Il existe les deux modèles suivants comme méthode de définition, mais certains comportements changeront.
#Écrivez directement dans
class TopKlass
class Klass
end
end
## ------ ##
# ”::Utilisation
class TopKlass
end
class TopKlass::Klass
end
・ Décrivez directement dans Il fait référence aux constantes dans l'ordre de lui-même au niveau supérieur. Le flux consiste à se référer au niveau supérieur dans l'ordre du plus proche de lui-même, et enfin au niveau supérieur.
VALUE = "Top level"
class TopKlass
VALUE = "in TopKlass"
class InnerKlass
def self.put_value
puts VALUE
end
end
end
TopKlass::InnerKlass.put_value
# => in TopKlass
・ Décrit à l'aide d'un espace de noms S'il n'a pas de constante, il fait alors référence au niveau supérieur et ensuite dans l'ordre à partir de là vers sa classe.
VALUE = "Top level"
class TopKlass
VALUE = "in TopKlass"
end
class TopKlass::InnerKlass
def self.put_value
puts VALUE
end
end
TopKlass::InnerKlass.put_value
# => Top level
· Décrit dans Puisque la classe ou le module est spécifié dans chaque hiérarchie, une erreur se produit si un module défini séparément est spécifié comme classe.
module TopKlass
end
class TopKlass
class InnerKlass
end
end
# => TopKlass is not a class (TypeError)
・ Décrit à l'aide d'un espace de noms Puisque c'est seulement celui décrit à la fin (extrême droite) qui spécifie s'il s'agit d'une classe ou non En dehors de cela, cela rend le jugement de la classe et du module flexible.
module TopKlass
end
class TopKlass::InnerKlass
end
#Pas d'erreur
· Décrit dans Dans l'exemple ci-dessous, si TopKlass n'a pas été défini séparément Aucune exception ne se produira car TopKlass est nouvellement défini.
class TopKlass
class InnerKlass
end
end
・ Décrit à l'aide d'un espace de noms
Dans les cas suivants, une exception sera levée si TopKlass n'est pas défini séparément. Il ne définit pas un nouveau TopKlass.
class TopKlass::InnerKlass
end
# => uninitialized constant TopKlass (NameError)
Recommended Posts