10月 242014
orと||は(優先度とか)違う演算子だという事は知ってたけど、左側がARGVかArrayかでもまた動作が違うとは思ってなかった。Rubyは難しい。
or演算子でデフォルト値をセット
Rubyで、値が無い時にデフォルト値をセットするのによくor演算子を使う。例えばコマンドラインからの引数を取り出して、何も値が無かったらデフォルト値を使うとかあると思う。
ARGVは配列なのでこうやろうと思った
user = ARGV.shift or "shokai"
引数なしだとARGVは空配列になるから、or演算子の右側のデフォルト値が左辺に渡されると思ったけど、そんなことはなかった。
![](http://shokai.org/archive/file/8f724e0c19ffbbfae79b0faad196469e.png)
Array#shift or “default value”ってできないんだっけ?と思ってARGVじゃなくてArrayで試した。こっちはできる。
![](http://shokai.org/archive/file/8c2561aed9f13fdfc3ab442f4dadbca7.png)
or のかわりに || を使ったら、空のARGVをshiftした時にorの右側が取り出せた。
![](http://shokai.org/archive/file/e34a868ce36c11f292a2e51755dcc3a3.png)
念のため確認したけどARGVはArrayを継承してる。でもorと||で挙動が違う・・
![](http://shokai.org/archive/file/25678f3b47d0dc148b933d003b51745a.png)
結論
orの方が好きだけどこう書く。arg1 = ARGV.shift || "defalut value"