【またまた】DOS画面での入力処理は面倒臭いですよね。
【続々】で、謎の古代文字 i_con = -> { gets(chomp: true) }を別の古代文字に差し替えて流用したことに対しての雑感です。
メソッドの引数に初期値のオブジェクトを与えることの利点。
ポンコツの目から見たプロシージャとは。
メソッドの引数に初期値のオブジェクトを与えることの利点。
クラス/モジュール内で、
def something_method(arg = something_object)
このような定義がされていた場合、大抵は、argを指定せずとも、
something_method
とすれば、使うことができるはずです。使う側は何の意識も持たずにsomething_methodのメッセージを送ることができます。ならば、引数を与えずとも、初めから
def something_method
と定義をすればいいのですが、そうはしない。ワザと引数に初期値のオブジェクトを与えて剥き出しにしておきます。まるで、パンツを穿かずにスカートを穿かさせるかのようにします。(下品な例えでスマン)
こうしておくと、外部からどこにあるか分からない中身の一部にアクセスできる穴を開けておくことが出来ます。【続々】では、
i_con = { IO: (-> { std_in.raw(&:getch).chomp }),
StringIO: (-> {std_in.getc.chomp }) }[std_in.class.to_s.to_sym]
として、
i_con = -> { gets(chomp: true) }
をstdioのgetchや、stringio用にgetcへ差し替えたりしています。
ノーパン・スカートにさせておけば、このように元のメソッドを変更しなくても運用に巾が出てくる可能性が広がるのです。
引数に初期値を与えておけば、
外部から内部のどこにあるかを知らなくともそこへアクセスが出来る。
メソッドの内部を変更しなくても使用できる可能性が上がる。
通常の使用者には、仕掛けを意識させないで使うことが出来る。
ポンコツの目から見たプロシージャとは。
まつもとゆきひろ氏監修の「たのしいRuby」をみると、プロシージャについて、こう記されています。
「Procは、
ブロックとして記述された手続きを持ち運ぶためのクラスです。」
わたしの今の実感は、
「Procは、郵便爆弾である。」
です。
もし、 引数にある i_con = -> { gets(chomp: true) }が
something_method(i_con = gets(chomp: true))
と"->"が抜けていたらどうなるでしょう。
当たり前ですが、getsメッセージが送られた瞬間、発動してしまいます。起爆装置が付いていないので、即爆発して自爆です。
だから、.callは、爆弾を爆発させるための起爆装置といえます。
爆発させたい箇所に.callを仕掛けることで威力を発揮します。逆に云えば、信管が作動しないことが分かっていれば、爆発も何も起こらないのです。プラスチック爆弾だったとしても、キャッチャボールさえ出来てしまいます。あちらこちらにポンポンと送り付けることができるのです。
別の感覚で云い換えれば、
プロシージャは、時間を止めることの出来るストップウォッチのようにも思えます。プロシージャの中のコードは、そのままでは時間が止まっていて、.callするとストップウォッチの針が進み出す感覚。
Procとか"->"って、最初はなんか取っ付き難かったのですが、いまではこんな感じです。
Procは、
相手に送り付けることのできる郵便爆弾
メソッドの中の引数について、ちょっと吠えてみました。へへ。