01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
2009-11-04 Wed
■ opCmp はどう書く? [D言語]
関係式
クラスオブジェクトの場合は、左オペランドに対して Object.opCmp()
の呼び出し結果と整数0、を演算子で比較した結果が式全体の値となります。
クラスの比較
クラスオブジェクトに対しては、
比較演算子はオブジェクトの内容を比較するものです。
従って、
内容を持たない null とオブジェクトを比較するのは不正なコードです。
こう書く。
int opCmp(Object o) in { assert(cast(ComString)o !is null,/* ComString 以外の型と比較したよ的メッセージ */); } body { ComString rhs = cast(ComString)o; if(rhs is null){ throw new Exception(/* ComString 以外の型と比較したよ的メッセージ */); } if(this.toString < rhs.toString){ return -1; }else if(this.toString > rhs.toString){ return 1; } return 0; }
■ 普通にキャストすればいいのか [D言語]
Cast 式
クラスオブジェクトへの参照を派生クラスへとキャストするときは常に、
そのダウンキャストが適切なものであるか実行時のチェックが入ります。
不適切なキャストのときは結果は null になります。
opEquals はこう書けばいいのか。
bool opEquals(Object o){ ComString rhs = cast(ComString)o;//o が ComString 型でないなら null if(rhs is null){ return false; } return this.toString == rhs.toString; }