- 論壇徽章:
- 0
|
Eloquent Ruby 讀書筆記 續(xù)
initializeruby
運算符重載和Ruby風格的運算符重載
程序大概意思是,重新定義,文件類的比較方法。只要目錄和文件名一樣,就說這兩個文件類一樣。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 true if other.equal?(self)
- return false unless other.instance_of?(self.class)
- folder == other.folder && name == other.name
- end
- end
復制代碼 Ruby代碼- 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
- 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
復制代碼 當我們用的時候
Ruby代碼- #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
- #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里沒有重載操作符。那么
Ruby代碼- 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
復制代碼 |
|