null, nop

Xtalには、Rubynilとほぼ同等な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メソッドが無かった

 }