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

时间:2008-10-02 09:46:57

标签: ruby

想象一下以下的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对象系统的理解。

2 个答案:

答案 0 :(得分:12)

模块中实例方法的主要目的是为包含它的类提供该功能。

以这种方式“混合”模块最常用作模拟multiple inheritance的方法,或者在继承不是正确范例的其他情况下(不是完美的“是一种”关系)但是你想分享行为。这是保存代码DRY的另一个工具。

核心Ruby中的一个很好的例子是注意ArrayHash如何被遍历和排序等等。它们每个都从Enumerable模块中获得这个功能({{ 1}},each_with_indexselectreject等都在包含的模块中定义,而不是在类中定义。

答案 1 :(得分:4)

我的回答是:“如果没有先在类中扩展或包含该模块,就不能调用模块实例方法”

现在知道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