From: Robert Klemme Date: 2004-08-09T22:21:17+09:00 Subject: Re: dynamic calling question "Martin Pirker" schrieb im Newsbeitrag news:41176b8e$0$18044$3b214f66@aconews.univie.ac.at... > On implementing a state machine I'm stuck at... > > > h = Hash::new > h["func1"] = "Outer::Inner::dothis" > h["func2"] = "whatever" > > def whatever(x) > puts "whatever happens #{x}" > end > > module Outer > module Inner > def dothis(c) > puts "I did it #{c} times" > end > module_function :dothis > end > end > > Outer::Inner::dothis(3) > __send__(h["func2"],9) > __send__(h["func1"],7) > > === cut here === > > $ ruby ztrick.rb > > I did it 3 times > whatever happens 9 > ztrick.rb:21:in '__send__': undefined method 'Outer::Inner::dothis' for main:Object (NoMethodError) > from ztest.rb:21 > > > > local calls look ok - how to do dynamic calls across module/class boundaries? > consider the hash mostly populated first and the functions are defined later > (or never at all) > I'm not even sure whether this is a syntax or missunderstanding issue :-/ Misunderstanding I guess: __send__ without an instance sends to self, which in this case != Outer::Inner. So for the general case you need also need the instance that the message should be sent to. Try this: h = Hash::new h["func1"] = Outer::Inner.method :dothis h["func2"] = method :whatever def whatever(x) puts "whatever happens #{x}" end module Outer module Inner def dothis(c) puts "I did it #{c} times" end module_function :dothis end end Outer::Inner::dothis(3) h["func2"].call 9 h["func1"].call 7 Regards robert