down cast続き
down castであってたっけ・・・
Typing Rubyで手も足も出ないのは,Rubyにおいて型付けが全く動的であり,down castが,ソースコードから検出できないことに起因する.
逆に言えばdown castさえ検出できれば良いわけで,例えば次のようにしてユーザーサイドで対応することはできる.
require 'truby' class IShape .... def edit(s,...) case s.type when s.line: adapt(s, Line).edit(...) when s.polygon: adapt(s, Polygon).edit(...) else : <error> end end
とかしてdown castが発生するところではかならずadaptという関数を通すようにすれば,adaptを適当にTyping Rubyで解析して,返り値が第二引数の示すクラスになるようにしてしまえばいい.adaptのRubyの定義は,
def adapt(x,klass) x end
とでもしておけば,(実行時のチェックはできないが)大丈夫だろう.
ここで問題にしているのは,
- 既存のプログラムがそういうdown castを無意識のうちに多用したプログラムになっているであろうこと
- 既存のプログラムに使われているdown castは逆立ちしたって検出できないこと
- そういうdown castをTyping Rubyのためだけに書き換えるのはちょっと書き換えのコストが大きすぎるであろうこと
なのだ.
昨日の日記にいただいたコメントは(そもそも理解できてないのだが),プログラムの余計な書き換えが必要であるという時点で,ちょっと「〜できますから,大丈夫ですよ.こっちにしてください」とは,言えないのだ.