かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

RangeだRange

とりあえずコードだけ!
Rangeとして使うにはsuccと<=>演算子が使えないと駄目だ!

class Hoge
    
    attr_reader :value

    def initialize value = 0
        @value = value
    end
    
    def succ
        @value += 1
        self
    end
    
    def <=>(other)
        @value <=> other.value
    end
end

h1 = Hoge.new
h2 = Hoge.new 4

(h1..h2).each {
    puts "aa"
}


# 2006/12/25追記
おっと、succで自分自身の状態変えたら駄目っぽい?
ってことでこういう風に

class Hoge
    def initialize value = 0
        @value = value
    end
    
    def succ
        n = Hoge.new @value + 1
        return n
    end
    
    def <=>(other)
        @value <=> other.value
    end
    
    protected
    attr_accessor :value
end

h1 = Hoge.new
h2 = Hoge.new 10

(h1..h2).each { |h|
    p h
}

実行結果は

#<Hoge:0x2940230 @value=0>
#<Hoge:0x2940118 @value=1>
#<Hoge:0x2940104 @value=2>
#<Hoge:0x29400b4 @value=3>
#<Hoge:0x2940078 @value=4>
#<Hoge:0x294003c @value=5>
#<Hoge:0x2940000 @value=6>
#<Hoge:0x293ffc4 @value=7>
#<Hoge:0x293ff88 @value=8>
#<Hoge:0x293ff4c @value=9>
#<Hoge:0x293ff10 @value=10>

OK!ばっちり。