| class SimpleFilter attr_reader :fltr_expres def initialize(fltr_expres) @fltr_expres = fltr_expres end def apply_filter(value) value.include?(@fltr_expres) end end class RegexFilter attr_reader :fltr_expres def initialize(fltr_exprs) @fltr_expres = fltr_exprs end def apply_filter(value) value =~ @fltr_expres end end # SimpleFilter和RegexFilter这两个类并不共享一个基类 # 在单元测试中对两个类的实例组成的集合进行迭带 # 简单的调用同名的"apply_filter()"方法就轻松实现了多态 # ruby没有接口,只要方法名匹配,就能轻松的实现了多态特性 require 'test/unit' class FilterTest < Test::Unit::TestCase def test_filters fltrs = [SimpleFilter.new('oo'), RegexFilter.new(/Go+gle/)] fltrs.each do |fltr| assert(fltr.apply_filter('I love to Google')) end end end |
在ruby中,class从来(几乎从来)不是type,相反,对象类型是根据对象能作什么决定的,即对象的behavior(method)。
查阅关于 Ruby 的全部文档