Foo = Class.new
Foo.class_eval do
def class_bar
"class_bar"
end
end
Foo.instance_eval do
def instance_bar
"instance_bar"
end
end
Foo.class_bar #=> undefined method ‘class_bar' for Foo:Class
Foo.new.class_bar #=> "class_bar"
Foo.instance_bar #=> "instance_bar"
Foo.new.instance_bar #=> undefined method ‘instance_bar' for #<Foo:0x7dce8>
Simplement en se basant sur le nom des méthodes, je m'attends à ce class_eval pour vous permettre d'ajouter une méthode de classe, Toto et instance_eval pour vous permettre d'ajouter une méthode d'instance de Foo. Mais ils semblent faire le contraire.
Dans l'exemple ci-dessus si vous appelez class_bar sur la classe Foo vous obtenez une méthode non définie erreur et si vous appelez instance_bar sur l'instance retournée par Foo.nouveau, vous obtenez également une méthode non définie erreur. Les erreurs semblent contredire une compréhension intuitive de ce que class_eval et instance_eval devrait le faire.
Ce qui est vraiment la différence entre ces méthodes?
Documentation pour class_eval:
mod.class_eval(string [, filename [, lineno]]) => obj
Évalue la chaîne ou d'un bloc dans le contexte du mod. Ceci peut être utilisé pour ajouter des méthodes à une classe.
Documentation pour instance_eval:
obj.instance_eval {| | bloc } => obj
Évalue une chaîne de caractères contenant Ruby le code source, ou le bloc donné, dans le contexte du récepteur (obj). Afin de définir le contexte, la variable auto est définie à l'obj tandis que le code est en cours d'exécution, en donnant le code l'accès à l'obj variables d'instance.