かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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!ばっちり。