没有类的模块中实例方法的目的是什么?
时间: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_index,
select,
reject)获得此功能。 ,
sort`和更多内容都在包含的模块中定义,而不是在类中定义)。