From: "Peña, Botp" Date: 2007-09-10T18:18:44+09:00 Subject: Re: module_function :func vs. MyModule.func? On Behalf Of 7stud -- # module MyModule # def MyModule.greet # puts "hello" # end # end # MyModule.greet # include MyModule # greet # --output:-- # hello # r1test.rb:10: undefined local variable or method `greet' for # main:Object (NameError) ruby keeps it simpler. botp@pc4all:~$ irb irb(main):001:0> module MyModule irb(main):002:1> def greet irb(main):003:2> puts "hello" irb(main):004:2> end irb(main):005:1> module_function :greet irb(main):006:1> end => MyModule irb(main):007:0> MyModule.greet hello => nil irb(main):008:0> greet NameError: undefined local variable or method `greet' for main:Object from (irb):8 from :0 irb(main):009:0> include MyModule => Object irb(main):010:0> greet hello => nil irb(main):011:0> public_methods.grep /greet/ => [] irb(main):012:0> private_methods.grep /greet/ => ["greet"] ok, namespacewise and ease of invocation, they behave like "fxns" indeed. fair enough. now, consider further, irb(main):013:0> module MyModule irb(main):014:1> def greet irb(main):015:2> puts "Aloha" irb(main):016:2> end irb(main):017:1> end => nil irb(main):018:0> MyModule.greet hello => nil irb(main):019:0> greet Aloha => nil Ah, another advantage: they allow for easy/independent modification, saving the original. irb(main):020:0> private_methods.grep /greet/ => [] irb(main):021:0> public_methods.grep /greet/ => ["greet"] irb(main):022:0> system "qri module_function | head" ------------------------------------------------- Module#module_function module_function(symbol, ...) => self ------------------------------------------------------------------------ Creates module functions for the named methods. These functions may be called with the module as a receiver, and also become available as instance methods to classes that mix in the module. Module functions are copies of the original, and so may be changed independently. The instance-method versions are made private. If used with no arguments, subsequently defined methods become module functions. => true kind regards -botp