想象一下以下的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对象系统的理解。
答案 0 :(得分:12)
模块中实例方法的主要目的是为包含它的类提供该功能。
以这种方式“混合”模块最常用作模拟multiple inheritance的方法,或者在继承不是正确范例的其他情况下(不是完美的“是一种”关系)但是你想分享行为。这是保存代码DRY的另一个工具。
核心Ruby中的一个很好的例子是注意Array
和Hash
如何被遍历和排序等等。它们每个都从Enumerable
模块中获得这个功能({{ 1}},each_with_index
,select
,reject
等都在包含的模块中定义,而不是在类中定义。
答案 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