Blog

Jan
14
The difference between eval, class_eval, module_eval, and instance_eval
by ELC | Snippet

At first glance, one would think that there is no difference between module_eval and class_eval, in fact, the method class_eval is an alias for module_eval.

Let’s take a look at the whole eval family:

  • module_eval
  • instance_eval
  • eval

module_eval
module_eval allows you to define new instance method for a class.


String.module_eval do
def foo
"bar"
end
end

"string".foo #=> "bar"

instance_eval
instance_eval evaluates a string or the given block within the context of the receiver. Be careful when using this method as it could create a public class method or public instance method.


String.instance_eval do
def foo
"bar"
end
end

String.foo #=> "bar"

foo = "foo"
foo.instance_eval do
def bar
"bar"
end
end
foo.bar #=> "bar"

eval
eval only takes a string to evaluate, unlike module_eval or instance_eval which can both evaluate a block instead. eval will evaluate the string in the current context or if a binding is given.


def getBinding(str)
return binding
end
str = "hello"
eval "str + ' Fred'" #=> "hello Fred"
eval "str + ' Fred'", getBinding("bye") #=> "bye Fred"

My Conclusion
module_eval is almost always what you want to use, and eval should always be your last resort.

No Comments