« [Ruby] WIN32OLE_EVENT#on_event_with_outargs | トップページ | [Ruby] WIN32OLE_EVENT#on_event_with_outargs (その3) »

2008年7月12日 (土)

[Ruby] WIN32OLE_EVENT#on_event_with_outargs (その2)

event.on_event('BeforeNavigate') {|*args|
  {:Cancel => true}
} 

と書けるのがすっきりしていい気がしてきた。

event.on_event('BeforeNavigate') {|*args|
  beforeNavigate(*args)
} 

とメソッドを定義した場合には、メソッドの中で

def beforeNavigate(*args)
  ...
  {:Cancel => true}
end

と書くか、

def beforeNavigate(*args)
  ...
  {5 => true} # 5番目の引数に trueを設定して返す。
end

でよい。メソッドの実行結果を戻り値としてOLEサーバー側に返したい場合は、:return を使って

def beforeNavigate(*args)
  {:return => true, 5 => true} 
end

のように書く。

|

« [Ruby] WIN32OLE_EVENT#on_event_with_outargs | トップページ | [Ruby] WIN32OLE_EVENT#on_event_with_outargs (その3) »

コメント

WIN32OLE_EVENTのことは何もわからないんですが。。。
こういうときは戻り値であれこれするよりも、こういうのを制御するオブジェクト、を渡してやる方がすっきり書けるようになる気がします。

例えば、ある特定の状態のときだけキャンセルしたいときですが、戻り値方式だとこうですよね。

event.on_event('BeforeNavigate') do |*args|
result = {}
...
result[:Cancel] = true if problem?
...
result
end

制御オブジェクトだとこうなります。

event.on_event('BeforeNavigate') do |control, *args|
...
control.cancel = true if problem?
...
end

キャンセルするかもしれないし、値を変更するかもしれないし、○○するかもしれないし、というのが多くなるとハッシュを組み立てていくよりもオブジェクトに覚えてもらった方がすっきり書ける気がします。

あと、オブジェクト方式だとメソッド名呼び出しでいろいろ操作するのでtypoが見つかりやすくなります。


ただ、制御オブジェクトという名前はそれでいいのか、とは思いますが。。。

投稿: kou | 2008年7月13日 (日) 09時02分

コメントありがとうございます。
制御オブジェクトの発想はちょっとなかったです。新鮮です。
まあ、ちょっと抵抗があるんですが...

Cancel はそもそもWin32OLE側で用意しているものではないんです。
InternetExplorer の BeforeNavigate2関数の7番目の引数の名前がCancelで
参照渡しになっていて、その値を変更することで、InternetExplorerの動作を
変更できるようになっています。

ここで問題になるのは、参照渡しの引数に対してRuby側(Win32OLE側)で値を
設定する仕組みを提供するためにどうするかというところなんです。

なので、
> キャンセルするかもしれないし、値を変更するかもしれないし、○○するかもしれないし
参照渡しの引数の値を変更することしか考えていません。

このために制御オブジェクトみたいなものを作るとすると、メソッド名は
あらかじめ決められないので、毎回動的に制御オブジェクトを生成してやる必
要があります。そこまでやるのはちょっと抵抗が...
あと、参照渡しの引数があるときだけ意味があって、参照渡しの引数がないときは、不要だし...。

あと、制御オブジェクトという名前は適切ではないですね。
名前は、引数オブジェクトとかStructにして引数Structみたいな名前ですかねえ。

投稿: suke | 2008年7月13日 (日) 11時39分

制御オブジェクトですが、結局メソッド名は、Win32OLE側で決められず、Rubyのメソッド名のネーミングルールと一致するかどうかまでは、わからないので、今のところ、保留です。

投稿: suke | 2008年7月13日 (日) 21時38分

この記事へのコメントは終了しました。

トラックバック


この記事へのトラックバック一覧です: [Ruby] WIN32OLE_EVENT#on_event_with_outargs (その2):

« [Ruby] WIN32OLE_EVENT#on_event_with_outargs | トップページ | [Ruby] WIN32OLE_EVENT#on_event_with_outargs (その3) »