ruby module 总结

2018-04-08  本文已影响0人  will2yang

1.Mix-in 扩展

module MyModule # 共通的方法等
end
class MyClass1
include MyModule
# MyClass1中独有的方法
end
class MyClass2
include MyModule
# MyClass2中独有的方法
end

2.提供命名空间

使用 模块名.方法 的方式调用方法 这样的方法称为 模块函数

# 检查文件是否存在
p FileTest.exist?("/usr/bin/ruby") #=> true
# 文件大小
p FileTest.size("/usr/bin/ruby") #=> 1374694

3.module_function

使用了module_function,就可以使用:“模块名 . 方法名”的形式调用

module FooModule
  def foo
    p self
  end
  module_function :foo
end
FooModule.foo

4.Mix-in

module M
  def meth
    "meth" 
  end
end
class C
  include M
end
c = C.new
p c.meth # =>  "meth"

C.include?(M)   #=> true

类 C 的实例在调用方法时,Ruby 会按类 C、模块 M、类 C 的父类 Object 这个顺序查找该 方法,并执行第一个找到的方法。被包含的模块的作用就类似于虚拟的父类。

5.查找方法的规则

1 同继承关系一样,原类中已经定义了同名的方法时,优先使用该方法。
2 在同一个类中包含多个模块时,优先使用最后一个包含的模块。
3 嵌套 include 时,查找顺序也是线性的,此时的关系如图 8.8 所示。
4 相同的模块被包含两次以上时,第二次以后的会被省略。

6.extend方法

extend方法可以使单例类包含模块,并把模块的功能扩展到对象中.

module Edition
  def edition(n)
    "#{self} 第#{n}版"
  end
end
str = "Ruby基础教程"
str.extend(Edition)   #=> 将模块 Mix-in 进对象
p str.edition(5) #=> "Ruby基础教程第5版"

include 可以帮助我们突破继承的限制,通过模块扩展类的功能;而 extend 则可以帮助 我们跨过类,直接通过模块扩展对象的功能。

上一篇 下一篇

猜你喜欢

热点阅读