ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

インデクサ([]演算子を使ってアクセスする)

プログラミングC# p197

オブジェクトに[]の機能を追加する機能です。
Rubyでもできますね。Javaはできないような気がします。
とりあえずサンプルコード。おなじみ(?)Rectangleのxをindex=0で、yをindex=1で読み書きできるようにしてみました。

using System;

class Rectangle
{
        private int x;
        private int y;

        public int this[int index]
        {
                get
                {
                        switch(index)
                        {
                                case 0:
                                        return x;
                                case 1:
                                        return y;
                                default:
                                        return -1;
                        }
                }

                set
                {
                        switch(index)
                        {
                                case 0:
                                        this.x = value;
                                        break;
                                case 1:
                                        this.y = value;
                                        break;
                        }
                }
        }

        public int area()
        {
                return this.x * this.y;
        }

        static void Main(string[] args)
        {
                Rectangle r = new Rectangle();
                r[0] = 5;
                r[1] = 4;

                Console.WriteLine("r.x = {0}, r.y = {1}, r.area = {2}", r[0], r[
1], r.area());
        }
}

結果はこう。

r.x = 5, r.y = 4, r.area = 20

うまく動いている感じ。
念のためRuby

class Rectangle
        def area()
                return @x * @y
        end


        def [](index)
                case index
                        when 0
                                return @x
                        when 1
                                return @y
                        else
                                return -1
                end
        end

        def []=(index, value)
                case index
                        when 0
                                @x = value
                        when 1
                                @y = value
                end
        end
end

r = Rectangle.new
r[0] = 5
r[1] = 4

print "r.x = ", r[0], ", r.y = ", r[1], ", r.area = ", r.area()

結果はこう。

r.x = 5, r.y = 4, r.area = 20

かなりの勢いでたのしいRubyの内容を忘れていることが判明。
まあ、リファレンスマニュアルを読んでなんとか書けた。