助田です。

In message "[ruby-ext:01503] Re: win32ole"
    on 01/01/21, nobu.nakada / nifty.ne.jp <nobu.nakada / nifty.ne.jp> writes:

>   Win32OLE って使ったことないのではずしてたらすいませんが、
> IEnum インターフェースを持ってたら extend(Enumerable) っていう
> のじゃどうでしょうか。インターフェースの有無を調べるコストが高
> くなければの話ですが。

はずしてないです。それは私もちょっと考えました。

で、話がずれてしまうのですが、結局、IEnumインターフェースを
持っていてもEnumerableをincludeするのは、やっぱりまずい気が
してきました。

例えば、Excelの例ですけど、

require 'win32ole'
range = worksheet.range("A1:D4")
range.find(5)

が動かなくなります。

Excelのfindメソッドが Enumerableのfindで上書きされてしまう
ためです。

たまたま、この場合は、

require 'win32ole'
range = worksheet.range("A1:D4")
range.find{|x| x == 5 }

とすればうまくいきます。

ですが、Enumerableで定義しているメソッドと
OLEサーバー側にあるメソッドの名前が同じだと破綻
するケースが出てきそうです。

なので、Win32OLE側では、Enumerableをinclude(extend)しません。

# Win32OLE側で定義されてるメソッドの名前がぶつかってるか
# どうか調べてからEnumerableをincludeするのはコスト
# がかかりすぎる気がするし。

  助田 雅紀