Rob*_*uld 15 ruby language-agnostic traits mixins
我正在阅读Ruby,并了解了它的mixins模式,但是没想到很多有用的mixin功能(因为我不习惯这么想的方式).所以我想知道什么是有用的Mixin功能的好例子?
谢谢
编辑:有点背景.我来自C++和其他对象语言,但我怀疑的是Ruby说它不是继承mixins,但我一直认为mixins是多重继承,所以我担心我想把它们分类太快进入我的舒适区,并没有真正了解mixin是什么.
Jon*_*ood 12
它们通常用于向类添加某种形式的标准功能,而无需重新定义它们.您可能认为它们有点像Java中的接口,但不仅仅是定义需要实现的方法列表,其中许多实际上都是通过包含模块来实现的.
标准库中有一些示例:
单例 - 可以混合到任何类中以使其成为单例的模块.initialize方法是私有的,并添加了一个实例方法,它确保应用程序中只有该类的一个实例.
可比较 - 如果将此模块包含在类中,则定义<=>方法(将当前实例与另一个对象进行比较,并说明哪个更大)足以提供<,<=,==,> =,>和之间?方法.
可枚举 - 通过混合此模块并定义每个方法,您可以获得所有其他相关方法的支持,例如collect,inject,select和reject.如果它也有<=>方法,那么它也将支持sort,min和max.
DataMapper也是一个有趣的例子,可以使用简单的include语句,采用标准类,并添加将其持久保存到数据存储的功能.
我认为通常的例子是持久性
module Persistence
def load sFileName
puts "load code to read #{sFileName} contents into my_data"
end
def save sFileName
puts "Uber code to persist #{@my_data} to #{sFileName}"
end
end
class BrandNewClass
include Persistence
attr :my_data
def data=(someData)
@my_data = someData
end
end
b = BrandNewClass.new
b.data = "My pwd"
b.save "MyFile.secret"
b.load "MyFile.secret"
Run Code Online (Sandbox Code Playgroud)
想象一下,该模块是由Ruby忍者编写的,它将您的类的状态保存到文件中.
现在假设我写了一个全新的类,我可以通过混合来重用持久性的功能include ModuleILike
.您甚至可以在运行时包含模块.我只需将其混合即可免费加载并保存方法.这些方法就像您为自己的课程编写的方法一样.代码/行为/功能 - 没有继承的重用!
所以你正在做的是为你的类包含方法表的方法(不是字面上正确但接近).
归档时间: |
|
查看次数: |
5675 次 |
最近记录: |