鍋あり谷あり

テーマを決めずに適当に書いています。

??演算子と何を偽とするか。

先日(id:Nabetani:20050703:p1 )の続き。

ruby は、false と nil 以外は真なので、例えば除算で、分母がゼロなら nil を返し、割り算ができるなら割り算の結果を返す関数が書ける。
C#2.0 でも、同じことができるようになった。C++ でも、boost::optional を使えばできる。
C ではそういうことができなかったので、getchar() は 失敗すると -1 を返したりするわけだが、ここで 偽 を意味する 0 を返せないのは、0 は意味のある返り値だからなんだなぁと改めて思った。
で。
pythonperl は使ったことがないが、ゼロが偽になるので、?? 演算子のようなことをするのに || を使うとちょっと困る。
なんて思うと、やっぱり ruby は素晴らしいと思うのであった。

それと。Nullable の話をもう一つ。
まずはソース:

int? foo() { return null; }
int? bar() { return null; }
int? baz() { return null; }
void test()
{
    int? a = null;
    int? b = a + foo();
    int? c = bar() + baz();
}

こんな感じでコンパイルが通り(int? は、Nullable と同義の糖衣)、あろうことかランタイムエラーも出ない。
null である Nullable に null を足したり引いたりすると、 null になるという仕様らしい。
私は例外を投げる方がいいと思うんだが、乱暴なプログラムを書くのにはそのままGOの方が便利なこともあるだろう。

むしろ問題は、foo(), bar(), baz() のうち、どれが呼ばれるのか。

試してみた。

結果は……。

全部呼ばれる。とほほ。
所詮遅延評価とは無縁な言語か。