模块与模块外的方法

时间:2016-05-18 22:08:39

标签: ruby methods module

我想知道在模块中使用模块与使用带有多种方法的简单文件而不创建模块之间的区别是什么,如下例所示:

def doStuff
  puts 'test';
end

module Example
  def self.doStuff
    puts 'test';
  end
end

我可能需要两个文件并使用其中的方法。我想知道为什么我应该创建一个模块而不是在.rb文件中只有一堆方法。

2 个答案:

答案 0 :(得分:1)

让我们找出答案。

module M
  def a; end
end

File.write("temp.rb", "def b\nputs 'hi'\nend") #=> 19
require_relative 'temp.rb'

class C
  include M
end

C.instance_methods & [:a, :b]                  #=> [:a] 
C.private_instance_methods & [:a, :b]          #=> [:b] 
C.instance_method(:b).owner                    #=> Object 

Object.instance_methods.include? :b            #=> false 
Object.private_instance_methods.include? :b    #=> true 

Object.send(:public, :b)                       #=> Object 
Object.instance_methods.include? :b            #=> true 
Object.private_instance_methods.include? :b    #=> false

C.instance_methods & [:a, :b]                  #=> [:a, :b] 
C.private_instance_methods & [:a, :b]          #=> [] 
C.new.b                                        #=> hi

如果我们写的话,结果是一样的:

class C
  include M
  require_relative 'temp.rb'
end

答案 1 :(得分:0)

模块允许您对方法进行分组,并且可以将它们包含在其他模块和类中。您可以将模块方法包含到模块/类本身或其本征类中。因此,使用模块可以获得更大的灵活性。更不用说你并没有把整个"全球"命名空间。

此外,在文件中定义方法时,您将在当前上下文中定义它。因为Ruby中的所有东西都是一个对象,所以你实际上是在main对象(Object类的一个实例)中定义它。

2.3.0 :001 > self
 => main 
2.3.0 :002 > self.class
 => Object 
2.3.0 :003 > self.object_id
 => 70123533022000 
2.3.0 :004 > def test; end;
2.3.0 :005 > self.public_methods.include? :test
 => true