之所以有不同的eval方法,只是因为在不同的上下文中;你也可以使用eval+bind参数完全替换class_eval/module_eval/instance_eval的
# "#{exp}" evaluates it as a string and not as an expression, whereas eval( exp ) evaluates a string as an expression.
exp = "2+4"
puts( eval( exp ))
puts( "#{exp}" )
# eval method can evaluate strings spanning many lines
eval( 'def aMethod( x )
return( x * 2 )
end
num = 100
puts( "This is the result of the calculation:" )
puts( aMethod( num ))' )
# special types of eval
class MyClass
def initialize
@aVar = "Hello world"
end
end
ob = MyClass.new
p( ob.instance_eval { @aVar } )
p( ob.instance_eval( "@aVar" ) )
# eval can evaluate expressions of arbitrary complexity
# such ass create method to String class
String::class_eval{ define_method(:bye){ puts("goodbye" ) } }
"Hello".bye #=> “goodbye”