input命令を実装するに当たって、result広域変数を用意しなければいけなくなったのだが、さてどういう仕様にしたものかということが悩ましい。
- Rubyは$で始まる変数は広域変数になるので、それを使う
- 広域変数用のモジュールを作って、そのモジュールのクラス変数およびアクセサを定義して使う
- いずこかに変数を定義し、トップレベルで定義したアクセサを経由して使う
さすがに三番目は邪悪にすぎるだろう。そうなると一番目か二番目だ。一番目の方法は広域変数であると分かりやすいし、書くのも楽だが、書くのが楽なやり方は濫用の元にもなる。二番目の方法はいちいちクラス名を指定しなければいけないので書くのは面倒くさいが、クラスに閉じているので他のRubyライブラリとの干渉を気にする必要がないし、クラス名による指定は記号より検索性が高いというのも利点だろう。また、三番目のやり方もまずいのはトップレベルの汚染なので、それをなんとかすれば使えるのだが、今はRubieraというモジュールをトップレベルにextendしてpirntなどを上書きしているので、いまさらという話ではある。これは将来的にはFiberの実行時のスコープにだけ展開されるようにする予定なので、トップレベルの汚染は避けられるようになる……といいなあ。そうすると、Rubiera配下にアクセサを定義して呼べばブロックからはトップレベルのように見えるようになるので、これなら悪くないだろう。
あと、Rubyは動的型付けなのでresultsを定義しなくてもresultだけでよかったりするのだが、そうすると型判別を自前でやらなくてはいけないので、ここもどうするのがいいか考えどころ。is_a?とかで簡単に調べられるのだが、いきなりそういういかにもRubyっぽいやり方に慣れてくれというのもどうだろうかと思うし。
まあぼちぼちやりましょかね。いつもどおり。
コメントをかく