Le problème est que le code TEST = ["#{self.name}", "test1"]
n'est interprété qu'une fois, lorsque la classe Post
est instanciée. Après cela, il sera fixé comme ["Post", "test1"]
.
Du haut de ma tête, je ne peux pas penser à une façon de faire ce travail avec une constante, mais si vous deviez le remplacer par une méthode de classe, il fonctionne très bien:
class Post
def self.TEST
[self.name, "test1"]
end
end
class FakePost < Post
end
Post.TEST
#=> ["Post", "test1"]
FakePost.TEST
#=> ["FakePost", "test1"]
La raison cela fonctionne est que le code à l'intérieur de la méthode de classe est interprété à l'exécution (c'est-à-dire lorsque vous appelez la méthode), plutôt que lorsque la classe est interprétée. Le calendrier pour les deux cas est la suivante:
Avec TEST
Constant:
- classe Post est instancié et interprété ligne par ligne.
self.name
est interprété et renvoie 'Post'
, car self
est actuellement la classe Post
.
Post::TEST
est réglé de manière irrévocable à ["Post", "test1"]
FakePost
classe est instanciée et hérite de Post
, y compris le déjà instanciée TEST
constante de ["Post", "test1"]
FakePost::TEST == Post::TEST == ["Post", "test1"] #=> true
Avec la méthode TEST
de classe:
- La classe Post est instanciée et interprétée d ligne par ligne.
- La méthode de classe de poste
TEST
est ajoutée (mais pas encore interprétée).La classe est instanciée et hérite de la méthode de classe TEST
de Post
. Toujours n'a pas encore été interprété.
- Lorsque vous exécutez
Post.TEST
ou FakePost.TEST
, la méthode sera finalement interprétée. self
sera maintenant soit Post
ou FakePost
selon la classe appelée la méthode TEST
.
Merci pour la réponse, mais je connais déjà cette réponse, mais il y a beaucoup de places et de contrôles nécessaires si je vais faire un changement, alors je pose une question ici. Je veux une solution pour travailler. – Sourabh
@ user4510998 autant que je sache, ce n'est pas possible comme vous voulez le faire - voir la chronologie dans mon édition pour la raison que cela ne fonctionne pas. – omnikron
Merci, est la meilleure pratique pour créer une méthode pour créer avec upcase? – Sourabh