先日(id:Nabetani:20050703:p1 )の続き。
ruby は、false と nil 以外は真なので、例えば除算で、分母がゼロなら nil を返し、割り算ができるなら割り算の結果を返す関数が書ける。
C#2.0 でも、同じことができるようになった。C++ でも、boost::optional を使えばできる。
C ではそういうことができなかったので、getchar() は 失敗すると -1 を返したりするわけだが、ここで 偽 を意味する 0 を返せないのは、0 は意味のある返り値だからなんだなぁと改めて思った。
で。
python や perl は使ったことがないが、ゼロが偽になるので、?? 演算子のようなことをするのに || を使うとちょっと困る。
なんて思うと、やっぱり 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
私は例外を投げる方がいいと思うんだが、乱暴なプログラムを書くのにはそのままGOの方が便利なこともあるだろう。
むしろ問題は、foo(), bar(), baz() のうち、どれが呼ばれるのか。
試してみた。
結果は……。
全部呼ばれる。とほほ。
所詮遅延評価とは無縁な言語か。