null, nop
Xtalには、Rubyのnilとほぼ同等なnullオブジェクトが存在します。
nullはnullが持っていないメソッド等を呼び出すと、例外が発生します。
そして、nullのような、しかしちょっと毛色の違う nop というオブジェクトが存在します。
nopはnopが持っていないメソッド呼び出しがあると、自分自身を返します。
try{ null.hogehoge; // 例外発生! }catch(e){ } nop.hogehoge.gehogeho; // nopはhogehogeメソッド呼び出しにまたnopを返し // そのnopに対しgehogehoメソッドを呼び出す // 例外は出ない
nopは .? 演算子のために用意されたオブジェクトです。
.? 演算子は、あるオブジェクトに対し、もしそのメソッドがあるならそれを呼び出し、無ければnopを返す、という演算子です。
a : []; // 配列オブジェクトをaに入れる try{ a.hogehoge; // Arrayはhogehogeメソッドを持っていないので例外が発生する }catch(e){} a.?hogehoge.gehogeho; // Arrayはhogehogeメソッドが用意されていないので、nopが返る。 // そのnopに対しgehogehoメソッドを呼び出す
戻り値がnopかどうか調べれば、ちゃんとメソッドが呼べたか調べることが出来ます。
// ===演算子(同一性を比較する演算子)でnopか調べる if(a.?hogehoge === nop){ // hogehogeメソッドが無かった }