リファレンスを見た限りではメソッドの引数を省略したときの値を指定できないっぽい。ようは可変長変数を使うんだと思うんだけど、これまた長い。んなわけで適当にマクロ化するメソッドを定義しとく。もしかしたらこんなことやらないでももっといい方法があるかもしれない。
/* pos : 引数の位置 name : 代入されるスロットのキー (勝手に初期化) default : デフォルトの値 */ Object opt := method(pos, name, default, if (sender doString("thisMessage argAt(" .. pos .. ")")) then ( sender doString(name .. " := sender doMessage(thisMessage argAt(" .. pos .. "))") ) else ( sender setSlot(name, default) ) )
んで以下のように使う。
List join := method( opt(0, "sep", "") ret := "" self foreach(index, value, ret = ret .. value if (index < self count - 1) then ( ret = ret .. sep ) ) ret ) l := List clone push("aaa") push("bbb") push("ccc") l join(", ") print //=> "aaa, bbb, ccc" l join print //=> "aaabbbccc"
Ruby の Array#join っぽいことをしてみる。 String join というメソッドがあるけど何かこのメソッドは位置がおかしいし、セパレータを引数にとれない。っぽい
というのはデフォルト引数が ""
きめうちだから。Io に $,
がないから (なくていい) ってことです。あーあと再帰的に join してないや。to_s メソッドとかないからその辺もやってないし。ようは List の中身が String 以外だと例外はきますよと。
どうでもいいけど if
を書くときに then
と else
を使うのは構造的違和感がある。でも可読性はこっちのほうがいいし、case
がないうえに if
の引数として書く場合 elseif
が書けないからどっちにしろ書くことにはなるんだけど。if
の引数に全部書くほうはワンライナー向けかしら。