著作一覧 |
WIN32OLE::ARGV
読み取り専用にしたいがためにクラス定数にしたがウカツだった。
これのせいで、-dを付けようものなら呼び出しの都度定数への代入警告がバカスカ出力されるのだが、どうしたものか、またはどうにかなっているかな?
C:\Home\arton\test>ruby -d ie.rb
ie.rb:13: warning: class variable ARGV of Object is overridden by WIN32OLE
ie.rb:17: warning: class variable ARGV of Object is overridden by WIN32OLE
今なら内部的にはインスタンス変数として、取り出し用にメソッドを用意すべきだった。
class WIN32OLE
def initialize()
@last_arguments = nil
end
...
attr_reader :last_arguments
end
こんな感じ。でも名前が変わるのはまずいだろうから
class WIN32OLE
@@argv = nil
def initialize()
@last_arguments = nil
end
def method_missing
obj.invoke
last_arguments = _
@@argv = _c #クラス変数へ最後の引数を保持
end
...
attr_reader :last_arguments
def ARGV() # こんなメソッド名は許されている?
@@argv
end
end
と、取り合えずメモ。
何やってんだか、9;00だというのについ調べ始めてしまったが、win32ole.cを読むと配列のインスタンスを最初に代入した後は、その配列のインスタンスのclearを呼んでプッシュするだけで、定数そのものへの代入は行っていないな……、と言うか、そう書いたんだからそりゃそうだ。とは言えミュータブルオブジェクトな定数というのがそもそもまずい選択だったわけなのだが。
なんで代入そのものを行っていないのに警告されるんだ?
該当メッセージはvariable.c#cvar_override_checkで、これを呼ぶのはrb_cvar_set (当然) だけではなく、rb_cvar_get ……なぜ?
#ということは、rb_define_constへ与えるrb_ary_newの結果をwin32ole.cで保持しておいて、それを直接操作すれば警告は出なくなるってことだな。
僕はエラーメッセージの意味を正しく理解してなかったわけですね、そりゃ??となるはずだ。
#グローバルなARGVがObjetの定数として持たれていることがわかってなかったってことだけど、rb_define_global_constを見れば一目瞭然だし。
ちなみに1.9以降で解消ということなので、いじるのはやめてしまおうかなと思いつつあります。
ジェズイットを見習え |