Ryan Leavengood
12/7/2005 5:51:00 PM
On 12/7/05, ts <decoux@moulon.inra.fr> wrote:
>
> rb_define_module_function() make the 2 calls
>
> rb_define_private_method()
> rb_define_singleton_method()
And this allows the given method to be called with both the module as
a receiver, as well as directly when the module is included in a
class. For example, the methods in module Math are defined this way:
irb(main):001:0> class MyMath
irb(main):002:1> include Math
irb(main):003:1> def some_complicated_math
irb(main):004:2> sqrt(4)
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> MyMath.new.some_complicated_math
=> 2.0
If they aren't defined this way, you can't call them from an instance:
irb(main):008:0> module Test
irb(main):009:1> def self.mod_meth
irb(main):010:2> p 'mod_meth'
irb(main):011:2> end
irb(main):012:1> end
=> nil
irb(main):013:0> class MyTest
irb(main):014:1> include Test
irb(main):015:1> def meth
irb(main):016:2> mod_meth
irb(main):017:2> end
irb(main):018:1> end
=> nil
irb(main):019:0> MyTest.new.meth
NameError: undefined local variable or method `mod_meth' for #<MyTest:0x2b388d8>
from (irb):16:in `meth'
from (irb):19
In Ruby you can get the equivalent behavior by defining instance
methods in the module, then extend self at the end:
irb(main):020:0> module Test2
irb(main):021:1> def mod_meth2
irb(main):022:2> p 'mod_meth2'
irb(main):023:2> end
irb(main):024:1> extend self
irb(main):025:1> end
=> Test2
irb(main):026:0> Test2.mod_meth2
"mod_meth2"
=> nil
irb(main):027:0> class MyTest2
irb(main):028:1> include Test2
irb(main):029:1> def meth2
irb(main):030:2> mod_meth2
irb(main):031:2> end
irb(main):032:1> end
=> nil
irb(main):033:0> MyTest2.new.meth2
"mod_meth2"
Regards,
Ryan