[Ruby] Méthodes singulières et classes singulières

introduction

J'ai décidé d'étudier les classes singulières et les méthodes singulières, je vais donc résumer le contenu.

Méthode singulière

Une méthode qui est "spécifique à un objet". Il peut être défini en écrivant le nom de l'objet avant le nom de la méthode à définir. Notez que l'objet doit déjà exister lorsque vous le définissez.

class Klass
end

apple = Klass.new
orenge = Klass.new

def apple.tokui_method
  puts "I'm apple"
end

apple.tokui_method
# => I'm apple
orenge.tokui_method
# => undefined method `tokui_method'

Si l'objet spécifié n'existe pas lors de sa définition, une erreur se produit.

class Klass
end

def apple.tokui_method
  puts "I'm apple"
end

apple = Klass.new

apple.tokui_method
# => undefined local variable or method `apple' for main:Object (NameError)

L'appel de super dans une méthode singulière appellera la méthode du même nom défini dans la classe. Il y a aussi la commodité de pouvoir remplacer cette méthode.

class Klass
  def my_name
    puts "I'm fruits"
  end
end

apple = Klass.new
orenge = Klass.new

def apple.my_name
  super
  puts "I'm apple"
end

apple.my_name
# => I'm fruits
# => I'm apple
orenge.my_name
# => I'm fruits

Classe singulière

Lorsque vous définissez une «méthode singulière» sur un objet, la classe dans laquelle cette méthode est définie est la «classe singulière».

Contrairement aux classes régulières, les classes singulières sont des classes utilisées uniquement par certains objets. Par conséquent, il est interdit de créer des objets ou des sous-classes à partir de classes singulières.

Pour vérifier la classe singulière d'un objet Utilisez Object # singleton_class.

class Klass
end

obj = Klass.new
# => #<Klass:0x00007f8fb584cc08>

TokuiClass = obj.singleton_class
# => #<Class:#<Klass:0x00007f8fb584cc08>>

TokuiClass.new
# => can't create instance of singleton class (TypeError)

class SubTokuiClass < TokuiClass
end
# => can't make subclass of singleton class (TypeError)

De plus, les méthodes singulières mentionnées ci-dessus sont définies dans des classes singulières. Concernant les méthodes singulières Vous pouvez le vérifier avec singleton_class.method_defined?.

class Klass
end

obj = Klass.new

def obj.tokui_method
  :tokui_method
end

p obj.class.method_defined? :tokui_method
# => false
p obj.singleton_class.method_defined? :tokui_method
# => true

Lorsque la classe singulière est créée

Lorsqu'un objet est créé, la classe singulière de cet objet n'existe pas. Une classe singulière est créée dans les cas suivants.

1, calendrier pour définir la méthode singulière 2, Moment de l'évaluation de l'expression de définition de classe singulière 3, Timing pour vérifier la classe singulière de l'objet avec Object # singleton_class

Moment pour définir la méthode singulière
obj = Klass.new

def obj.tokui_method
  :tokui_method
end
Moment de l'évaluation de l'expression de définition de classe singulière
class << obj
end
Minutage pour vérifier la classe singulière pour l'objet avec Object # singleton_class

Si la classe singulière n'existe pas au moment où vous avez essayé de vérifier, elle sera nouvellement créée.

obj.singleton_class

Objets et classes singulières

Une classe singulière est une sous-classe de la classe de l'objet.

class Klass
end

obj = Klass.new
obj.singleton_class.supperclass
# => Klass

Lorsqu'une classe singulière est créée pour un objet, cet objet devient une instance de la classe singulière, mais en Ruby Le fait d'être une instance d'une classe singulière est désormais ignoré et est toujours traité comme une instance de la classe de l'objet. Vous pouvez vérifier s'il s'agit d'une instance directe de l'argument avec Object # instance_of?, Alors utilisons ceci.

obj.instance_of? obj.singleton_class
# => false

obj.instance_of? Klass
# => true

Objets qui n'ont pas de classes singulières

Les objets suivants ne peuvent pas avoir de classes singulières dans Ruby.

--Valeur numérique

Les entiers et les symboles retournent une erreur
1.singleton_class
# => can't define singleton (TypeError)
:symble.singleton_class
# => can't define singleton (TypeError)
true, false, nil renverra leur classe en tant que classe singulière
p true.singleton_class
# => TrueClass

p false.singleton_class
# => FalseClass

p nil.singleton_class
# => NilClass

Recommended Posts

[Ruby] Méthodes singulières et classes singulières
Méthodes et classes Ruby (basiques)
[Ruby] Classes et instances
Classes et instances Ruby
[Java] Classe générique et méthode générique
À propos des classes et des instances Ruby
Création de classes et d'instances Ruby
Méthodes et classes abstraites Java
Entrée standard Ruby et diverses méthodes
Comment appeler des classes et des méthodes
Java Generics (définit les classes et les méthodes)
Programmation Java (classes et instances, méthodes principales)
Fonctions et méthodes
Cours et méthodes abstraits d'histoire d'apprentissage JAVA
Comparaison des objets JavaScript et des classes Ruby
Écrire du code à l'aide de classes et d'instances Ruby
Rubis et gemme
À propos des méthodes Ruby
[Java] Résumé personnel des classes et méthodes (basique)
[Ruby] Big Decimal et DECIMAL
À propos des classes et des instances
À propos des méthodes d'instance Ruby
Héritage et délégation Ruby
Méthode [Ruby], méthode d'instance ...
Liste et cours heureux
java (classe et instance)
Différences entre les classes et les instances dans Ruby
Méthode de codage et principe de refactoring
Comment séparer les mots dans les noms dans les classes, les méthodes et les variables
(Remarque) Classes / variables / méthodes Java
Erreurs de syntaxe et contre-mesures Ruby
À propos des hachages et symboles Ruby
Extension Ruby C et volatile
Résumer l'injection de rubis et de dépendances
À propos des classes et des instances (évolution)
À propos de la méthode Pluck et de la méthode ID
Prise en compte des classes et des instances
Méthodes Java et surcharges de méthodes
Que sont les méthodes de classe Ruby?
À propos de Ruby, modèle objet
[Ruby] Méthodes de classe, méthodes d'instance, etc.
La différence entre la programmation qui utilise des classes Ruby et la programmation qui n'utilise pas
[Ruby] Différence entre obtenir et publier
À propos des méthodes Java statiques et non statiques
Écrire des méthodes Ruby en utilisant C (Partie 1)
À propos des méthodes equals () et hashcode ()