Ruby 怎么理解 extend

hiveer · 2014年06月25日 · 最后由 hiveer 回复于 2014年07月02日 · 2438 次阅读

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 谢谢您的详细解答,对于“初始化模块中的某些属性(很少用),能不能给个例子呢?”

需要 登录 后方可回复, 如果你还没有账号请 注册新账号