Hi,
I have two different modules that contain a few methods with the same
name so I cannot include the modules in the code and I need to do
something like:
module Module1
def myMethod
puts "hi"
end
def others
end
end
module Module2
def myMethod
puts "more hi"
end
end
a=MyModule1.myMethod
b=MyModule2.myMethod
But it's not working, the error is: undefined method 'myMethod'
any idea??
Thanks.
···
--
Posted via http://www.ruby-forum.com/.
If you want to call a method from a Module that's not supposed to be
part of the instance of a class, then you can try this:
module Module1
def self.myMethod
puts "hi"
end
def others
end
end
irb(main):020:0> Module1.myMethod
hi
Jesus.
···
On Wed, Nov 19, 2008 at 11:40 AM, Mario Ruiz <mario@betware.com> wrote:
Hi,
I have two different modules that contain a few methods with the same
name so I cannot include the modules in the code and I need to do
something like:
module Module1
def myMethod
puts "hi"
end
def others
end
end
module Module2
def myMethod
puts "more hi"
end
end
a=MyModule1.myMethod
b=MyModule2.myMethod
But it's not working, the error is: undefined method 'myMethod'
any idea??
In my case is a little bit more complicated since the modules I'll use
are the output of another application and I cannot change the content.
I'm doing something like:
m1=Module1
m1.instance_methods.each {|b|
# here I'm checking if the methods exist on Module2
# Also I'm running the method and getting the result in both modules
}
···
--
Posted via http://www.ruby-forum.com/.
One way I managed to do it, although I'm not sure it makes sense for
your case is:
irb(main):039:0> module Test
irb(main):040:1> def met
irb(main):041:2> puts "hi"
irb(main):042:2> end
irb(main):043:1> end
=> nil
irb(main):053:0> o = Object.new
irb(main):054:0> o.extend(Test)
=> #<Object:0xb7b543a4>
irb(main):057:0> Test.instance_method("met").bind(o).call
hi
That's because to call an instance method you need an object that is
the instance. So we build a "fake" object, extend it with the module,
bind the method to it and call it. Or you could just call the method
directly on the object:
irb(main):059:0> o.send("met")
hi
So for your case:
irb(main):060:0> o = Object.new
=> #<Object:0xb7c2c0ec>
irb(main):061:0> o.extend(Test)
=> #<Object:0xb7c2c0ec>
irb(main):062:0> Test.instance_methods.each {|m| o.send(m)}
hi
Of course this assumes (and I think that your use case too) that the
instance methods of the Module don't expect anything in the instance
binding they are called: i.e. they don't expect an 'each' method
defined or something like that.
Jesus.
···
On Wed, Nov 19, 2008 at 12:19 PM, Mario Ruiz <mario@betware.com> wrote:
In my case is a little bit more complicated since the modules I'll use
are the output of another application and I cannot change the content.
I'm doing something like:
m1=Module1
m1.instance_methods.each {|b|
# here I'm checking if the methods exist on Module2
# Also I'm running the method and getting the result in both modules
}
So, there is not an easier way to call a method inside a module...
something like:
MyModule.myMethod
or
MyModule.method(myName).call
thank you.
···
--
Posted via http://www.ruby-forum.com/.
* Mario Ruiz <mario@betware.com> [2008-11-20 01:58:02 +0900]:
So, there is not an easier way to call a method inside a module...
something like:
MyModule.myMethod
or
MyModule.method(myName).call
How about this:
irb(main):001:0> module MyModule
irb(main):002:1> class MyClass
irb(main):003:2> def mymethod
irb(main):004:3> "hello"
irb(main):005:3> end
irb(main):006:2> end
irb(main):007:1> end
=> nil
irb(main):008:0> MyModule::MyClass.new.mymethod
=> "hello"
saji
···
---
--
Saji N. Hameed
APEC Climate Center +82 51 668 7470
National Pension Corporation Busan Building 12F
Yeonsan 2-dong, Yeonje-gu, BUSAN 611705 saji@apcc21.net
KOREA