没有类的模块中实例方法的目的是什么?

时间:2020-03-06 15:01:03  来源:igfitidea点击:

想象一下下面的Ruby模块:

module Foo
  def inst_method
    puts "Called Foo.inst_method"
  end
  def self.class_method
    puts "Called Foo.class_method"
  end
end

显然,可以在没有任何类实例的情况下调用Foo.class_method。但是,Foo.inst_method发生了什么?是否可以在不事先包含/扩展类的情况下调用Foo.inst_method

免责声明:问题不在于解决实际问题。我只是想增进我对Ruby对象系统的理解。

解决方案

我的回答是:"不,如果不首先扩展该模块或者将其包含在类中,就无法调用模块实例方法"

现在知道了ruby及其包含的所有元编程技巧,可能有一种调用它的方法,但它超出了模块的预期用途

module Tester
  def inst_meth
    puts "test inst meth\n"
  end

  def self.meth
    puts "test self meth\n"
  end
end

begin
  Tester.meth
rescue;
  puts $!
end
begin
  Tester.inst_meth
rescue
  puts $!
end
begin
  Tester.new.inst_meth
rescue
  puts $!
end
begin
  extend Tester
  inst_meth
rescue
  puts $!
end
begin
  include Tester
  inst_meth
rescue
  puts $!
end

>ruby test.rb
test self meth
undefined method `inst_meth' for Tester:Module
undefined method `new' for Tester:Module
 test inst meth
 test inst meth

模块内实例方法的主要目的是将功能提供给包含它的类。

以这种方式"混合"模块最常用作模拟多重继承的方法,或者在其他情况下继承不是正确的范例(不是很完美的"是"关系)但我们要共享行为的其他情况。这是使代码保持干燥的另一种工具。

Ruby核心中的一个很好的例子是注意Array和Hash如何都可以被旅行和排序,等等。它们每个都从Enumerable模块(each_with_indexselectreject)获得此功能。 ,sort`和更多内容都在包含的模块中定义,而不是在类中定义)。