I've been trying to write a method that can dynamically mixin a module
to a class. I tried the following code:
#=========================================
module MixinUtils
def MixinUtils.includeMixin(className,mixinName,vars)
evalStr= <<-END
class #{className.to_s}
include #{mixinName.to_s}
end
END
eval(evalStr, vars)
end
end
module Foo
def printFoo
puts "foo"
end
end
class Array
def someMethod
self.each do |item|
MixinUtils.includeMixin(item.class.to_s,"Foo",binding)
item.printFoo
end
end
end
[1,2,3].someMethod
#======================================
But running this gives
question.rb:22:in `something': undefined method `printFoo' for
1:Fixnum (NoMethodError)
from question.rb:20:in `each'
from question.rb:20:in `something'
from question.rb:31
But if I take out the '[1,nil,true].something' and append
a=1
MixinUtils.includeMixin("Fixnum","Foo",binding)
a.printFoo
it produces
foo
as expected. Why the difference? Why does calling 'binding' inside a
block produce different results? Thanks in advance...
Ben