Ruby中关于模块的知识

2017-11-17 10:55:41来源:oschina作者:穿山人点击

分享
class Point
attr_accessor :x, :y
def initialize(x, y)
@x = x
@y = y
end
end
# 1 Module是不能实例化的
# 2 Module中既可以有实例方法也可以有类方法
module Helper
def self.plus(obj)
print obj.x + obj.y
end
def min(obj)
print obj.x - obj.y
end
end
p = Point.new(3, 4)
# 3 模块中的类方法直接通过模块调用即可,并且类方法无法被mixin
Helper.plus(p)
# 4 使用include将模块的实例方法mix进来 当实例方法使用
# 5 使用extend将模块的实例方法mix进来 当类方法使用
class Point
include Helper
extend Helper
end
Point.min(p)
p.min(p)
# 6 如果想同时mix 类方法和实例方法
module Helper2
# instance method
def plus(obj)
print obj.x + obj.y
end
# class method
module ClassMethod
def min(obj)
print obj.x - obj.y
end
end
# 只要当前这个module被include某个class中 这个方法就会被调用
# 将ClassMethod下的方法 mix成 类方法
def self.included(klass)
klass.extend ClassMethod
end
end
class Point2
attr_accessor :x, :y
include Helper2
def initialize(x, y)
@x, @y = x, y
end
end
p = Point2.new(8, 4)
Point2.min(p)
p.plus(p)
# 7 查看该类的模块
p Point2.included_modules
# 8 判断是否是该模块
p Point2.include?(Helper2)
# 9 查看所有的祖先 其中包括模块
p Point.ancestors
# 10 去除其中的模块部分
p Point.ancestors - Point.included_modules
# 11 产看Point所属类 所属类为Class Class也是类
p Point.class
# 12 模块属于Module类
p Helper2.class
# Class类的父类是模块 所有Class的父类都是module
p Point.class.superclass

相关文章

    无相关信息

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台