万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

Boo Language Advent Calendar 2012 15日目 Title:「演算子のオーバロード」

URL: http://atnd.org/events/34622
今日で15日目ですね。あと10日でクリスマスですよ。

UnityScriptでもできるそうなので、Booで演算子オーバーロードしたいと思います。
何かといいますと、
あるクラスの2つの値が格納された時に、
そのインスタンス同士で演算をしたいのです。
「+」や「-」などで計算を行えるようにしたいということです。
例えばUnityのVector3の値+Vector3の値ができるようなものです。

UnityScriptでのコードはこちらを参考にしました
http://d.hatena.ne.jp/tanku/20120606/1338999149

C#のドキュメントはこちらにあります
http://msdn.microsoft.com/en-us/library/ms229032%28VS.80%29.aspx

まずOverloadOperatorクラスを作ります。

・OverloadOperator.boo

class OverloadOperator:
    public mA as int = 0
    public mB as int = 0

    def constructor(a as int, b as int):
        mA = a
        mB = b

    static def op_Addition(a as OverloadOperator, b as OverloadOperator):
        return OverloadOperator(a.mA + b.mA, a.mB + b.mB)

op_Additionが足し算を実現するものです。

実際の計算はこちらです。参考にしたサイトをBooにポートしただけですが。

import UnityEngine

class Test (MonoBehaviour):

    def Start ():
        a = OverloadOperator(10, 200)
        b = OverloadOperator(30, 20)
        c = a + b
        Debug.Log("a:"+a.mA+","+a.mB + " b:"+b.mA+","+b.mB + " c:"+c.mA+","+c.mB)

こうするとログに
a:10,200 b:30,20 c:40,220

がでるはずです。
a + bが実現できて、cの値にはaとbのそれぞれの2値が足し算できるってわけです。
引き算はop_Subtractionを使ったりいろいろあるので試したら面白いと思います。

では、また次の方へ!次も僕なら例外処理とかクロージャやりますよ。