extend 怎么处理 module 中的类方法以及常量
module Foo class Coo end def self.test puts 'ttt' end end class Bar extend Foo end
以上面的代码为基础,现在我想知道对于 Bar 而言,test 和 Coo 究竟是什么角色?怎么访问?有什么实际用途?
extend 是 class《self 的快捷方式,相当于打开单体类,然后 include Foo 模块。跟类 include 模块含义一样 test 方法是模块 Foo 的单体方法(类方法),存在于模块的单体类中。跟类调用类方法一样,Foo.test 类 Coo 只是一个定义在 Foo 模块中的普通类,通过 Foo::Coo 来访问。定义在模块中,为了避免类名重复,此时模块充当了命名空间的角色。 三者之间没有必然的联系
@liy_j 如果说模块里面的实例方法是用来给 include 或者是 extend 他的类做扩展用,那么模块的类方法又有什么实际的用处呢?
#2 楼 @hiveer Math.sin, Math.cos
#2 楼 @hiveer 类方法应用和实际应用场景有关 不需要 include 模块,就可以直接调用。不希望包含类的实例调用该方法。 初始化模块中某些属性(很少用) 除了标准库外,一般很少会再模块中定义类方法,一般只是用来 mixin 实例方法
@jun1st 谢谢,这个例子很好,一下就明白了它的用处 @liy_j 谢谢您的详细解答,对于“初始化模块中的某些属性(很少用),能不能给个例子呢?”