[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

calling binding() within a module method (for mixin)?????

bhbrinckerhoff

11/7/2004 8:12:00 AM

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
3 Answers

ts

11/7/2004 10:18:00 AM

0

>>>>> "B" == Ben <bhbrinckerhoff@wustl.edu> writes:

B> eval(evalStr, vars)

eval is evil

B> end

write it like this

B> MixinUtils.includeMixin(item.class.to_s,"Foo",binding)
B> item.printFoo

Array::Fixnum.new.printFoo

B> end



Guy Decoux


Pit Capitain

11/7/2004 11:51:00 AM

0

Ben schrieb:
> I've been trying to write a method that can dynamically mixin a module
> to a class. I tried the following code:
> (... code using eval ...)

Hi Ben,

in order to avoid eval as Guy suggested, you could try

module MixinUtils
def self.includeMixin(klass, mixin)
klass.send(:include, mixin) # include is a private method
end
end

module Foo
def printFoo
puts "foo"
end
end

class Array
def someMethod
self.each do |item|
MixinUtils.includeMixin(item.class, Foo)
item.printFoo
end
end
end

Calling

[1,nil,true].someMethod

results in

foo
foo
foo

as you expected.

Regards,
Pit


bhbrinckerhoff

11/10/2004 10:24:00 PM

0

Pit Capitain <pit@capitain.de> wrote in message news:<418E0C85.3050502@capitain.de>...
> Ben schrieb:
> > I've been trying to write a method that can dynamically mixin a module
> > to a class. I tried the following code:
> > (... code using eval ...)
>
> Hi Ben,
>
> in order to avoid eval as Guy suggested, you could try
>
> module MixinUtils
> def self.includeMixin(klass, mixin)
> klass.send(:include, mixin) # include is a private method
> end
> end
>
> module Foo
> def printFoo
> puts "foo"
> end
> end
>
> class Array
> def someMethod
> self.each do |item|
> MixinUtils.includeMixin(item.class, Foo)
> item.printFoo
> end
> end
> end
>
> Calling
>
> [1,nil,true].someMethod
>
> results in
>
> foo
> foo
> foo
>
> as you expected.
>
> Regards,
> Pit

I'll try this out. Thanks!