运算符重载和Ruby风格的运算符重载
程序大概意思是,重新定义,文件类的比较方法。只要目录和文件名一样,就说这两个文件类一样。ruby的
class DocumentPointer
attr_reader :folder, :name
def initialize( folder, name )
@folder = folder
@name = name
end
def ==(other)
return true if other.equal?(self)
return false unless other.instance_of?(self.class)
folder == other.folder && name == other.name
end
end
class DocumentPointer
attr_reader :folder, :name
def initialize( folder, name )
@folder = folder
@name = name
end
def ==(other)
return false unless other.respond_to?(:folder)
return false unless other.respond_to?(:name)
folder == other.folder && name == other.name
end
end
当我们用的时候
#Asymmetry
class ContractIdentifier < DocumentIdentifier
end
doc_id = DocumentIdentifier.new( 'contracts', 'Book Deal' )
con_id = ContractIdentifier.new( 'contracts', 'Book Deal' )
puts "They are equal!" if doc_id == con_id
会出现子类没有父类方法的问题,在contractIdentifier里没有重载操作符。那么
class VersionedIdentifier < DocumentIdentifier
attr_reader :version
def initialize(folder, name, version)
super(folder, name)
Well-Behaved Equality 147
@version = version
end
def ==(other)
if other.instance_of? VersionedIdentifier
other.folder == folder &&
other.name == name &&
other.version == version
elsif other.instance_of? DocumentIdentifier
other.folder == folder && other.name == name
else
false
end
end
end