class_eval
n'a vraiment rien à voir avec class << className
.
A.class_eval do
...
end
est équivalent à
class A
...
end
avec quelques différences. class_eval utilise un bloc (ou une chaîne, mais en l'ignorant pour l'instant) ce qui signifie qu'il se ferme sur la portée lexicale qui le contient. En d'autres termes, vous pouvez utiliser des variables locales de la portée environnante. Le bloc de classe commune introduit une toute nouvelle portée. De même, vous pouvez créer le bloc et le passer à de nombreux class_eval différents, et le corps du bloc sera exécuté dans le contexte de la classe que vous appelez class_eval.
class << className
ouvre la classe singleton de className
, vous permettant de définir des méthodes de classe.
class << A
def foo
...
end
end
est le même que
def A.foo
...
end
Notez que ce sont des méthodes de classe Oly si A se trouve être une classe (presque) tous les objets Ruby ont des classes singleton et vous pouvez définir des méthodes pour les utiliser l'une de ces deux syntaxes. L'avantage de class << obj
est principalement si vous définissez de nombreuses méthodes singleton en une seule fois.