我想知道在模块中使用模块与使用带有多种方法的简单文件而不创建模块之间的区别是什么,如下例所示:
def doStuff
puts 'test';
end
module Example
def self.doStuff
puts 'test';
end
end
我可能需要两个文件并使用其中的方法。我想知道为什么我应该创建一个模块而不是在.rb
文件中只有一堆方法。
答案 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