Forum: Ruby Run a method in a Module

Announcement (2017-05-07): www.ruby-forum.com is now read-only since I unfortunately do not have the time to support and maintain the forum any more. Please see rubyonrails.org/community and ruby-lang.org/en/community for other Rails- und Ruby-related community platforms.
Mario R. (Guest)
on 2008-11-19 12:43
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.
Jesús Gabriel y Galán (Guest)
on 2008-11-19 12:56
(Received via mailing list)
On Wed, Nov 19, 2008 at 11:40 AM, Mario R. 
<removed_email_address@domain.invalid> wrote:
>  end
>
> But it's not working, the error is: undefined method 'myMethod'
>
> any idea??

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.
Mario R. (Guest)
on 2008-11-19 13:22
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
}
Jesús Gabriel y Galán (Guest)
on 2008-11-19 13:41
(Received via mailing list)
On Wed, Nov 19, 2008 at 12:19 PM, Mario R. 
<removed_email_address@domain.invalid> 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
> }

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.
Mario R. (Guest)
on 2008-11-19 19:01
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.
Saji N. Hameed (Guest)
on 2008-11-19 19:31
(Received via mailing list)
* Mario R. <removed_email_address@domain.invalid> [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 
removed_email_address@domain.invalid
KOREA
This topic is locked and can not be replied to.