Tag: Ruby/基本
class Color attr_reader :name def hash name.hash end def eql?(other) name.eql?(other.name) end
# coding: utf-8 class Version # 各バージョン番号が等しい場合同値とみなすバージョンクラス # Comparableをincludeして<=>演算子を実装し、比較可能(これで==演算子が自動的に定義される) # eql?を==のaliasとし、hash演算子を定義することでハッシュのキーとしても利用可能 include Comparable attr_accessor :major, :minor, :patch def initialize(major, minor, patch) @major = major @minor = minor @patch = patch end def <=> (other) # 比較対象のクラスをチェック return nil unless other.is_a?(Version) # 各バージョンの比較結果がzero以外を返したときはその比較結果を返す。全く同じ場合は0を返す [major <=> other.major, minor <=> other.minor, patch <=> other.patch].detect {|n| !n.zero?} || 0 end alias_method :eql?, :== def hash # Effective Rubyによるhash値の実装 [major, minor, patch].hash end end if __FILE__ == $0 v1 = Version.new(2, 10, 4) v2 = Version.new(2, 1, 1) p [v1, v2].sort h = {} v1a = Version.new(3, 2, 4) v1b = Version.new(3, 2, 4) h[v1a] = "test" p h[v1a] p h[v1b] end
[#<Version:0x007f9fcba3a940 @major=2, @minor=1, @patch=1>, #<Version:0x007f9fcba3a968 @major=2, @minor=10, @patch=4>] "test" "test"