if, unless, ?, !

もっとも単純かつ使用頻度の高い分岐手段です。Object.ifはselfがtrueの場合に第一引数を、falseの場合には第二引数をそれが存在する場合に評価します。第三引数以降が存在する場合は、第二引数の結果がtrueなら第三引数を、falseなら第四引数を…と繰り返します。戻り値は最後に評価したブロックの戻り値です。何も評価しなかった場合はNULLオブジェクトが返ります。unlessはtrueとfalseの場合がifの逆になるものです。
構文ではなく、普通のメソッドですので、遅延評価させるためにブロックを引数に置くことになります。


0.== 0.if(['true']['false']).flush //trueが出力
ブロック以外の値の場合はそのまま返されるため、上記の例は下記のように書いても同じです。

0.== 0.if('true' 'false').flush //trueが出力
ifと?、unlessと!はそれぞれ同じものです。記号を使うとバイナリ演算子扱いとなり、括弧を使わずに引数を与えることができます。

0.== 0.? ['true'.flush] //trueが出力
0.== 0.! ['false'.flush] //なにも起こらず
コンマで引数を繋げることで、演算子に複数の引数を与えることが可能です。引数が3つ以上ある場合も含めここに例示します。

x: 2
x.== 0.? [
'if x == 0'.flush
], [x.== 1], [
'else if x == 1'.flush
], [
'else'.flush
] //elseが出力


Blockオブジェクトにもifメソッドがありますが、whileメソッドとの整合性や比較値の後置のために定義したものの、まったく使ってませんので、将来的に廃止されるかもしれません。引数で比較するとなると、どうしても括弧が必要になるためバイナリオペレータメソッドの特性が生かせませんし、前置のほうが実行順に並ぶので自然な気がします。


['true'.flush].if(0.== 0) //trueが出力
['true'.flush].? 0.== 0 //Block.?(0)の戻り値であるNULLオブジェクトの==メソッドを実行するため、ほぼ間違いなく強制終了。