[Ruby] Win32OLE と Enumerable
WIN32OLEクラスはEnumerableをincludeした方がいいのかどうか。
問題になるとわかっているのは、ExcelのRangeのFindメソッド。
require 'win32ole'
excel = WIN32OLE.new('Excel.Application')
excel.visible = true
book = excel.workbooks.add
sheet = book.worksheets(1)
sheet.cells(1,1).value = 1
sheet.cells(1,2).value = 2
sheet.cells(1,3).value = 3
r = sheet.cells.find(3) # ココが問題になる
puts r.address
WIN32OLEがEnumerableをincludeした場合、どうなるかは簡単に試せる。
require 'win32ole'
class WIN32OLE
include Enumerable
end
excel = WIN32OLE.new('Excel.Application')
... (skip)
r = sheet.cells.find(3) # ココでエラーになる
puts r.address
エラーを回避するためには、
r = sheet.cells.find {|cell|
cell.value == 3
}
と書く必要がある。
Rubyに毒されている人は、こっちの方がなんとなくRubyっぽくて好き
だったりするかも。
VB(A)に毒されている人は、そもそも
r = sheet.cells.Find(3)
と書くので、
WIN32OLEがEnumerableをincludeしてもさほど問題にならないのではないかと思い始めた。
という訳で、今の気分は、WIN32OLEはEnumerableをincludeする方に
ぐっと傾いているのだけど、どうだろうか。
意見求む。
| 固定リンク
この記事へのコメントは終了しました。
コメント
select の方がもっと厄介じゃん。
投稿: suke | 2006年9月29日 (金) 22時31分
今更、それは無いに一票。そもそもFindと書くというけど、VBな人でもRubyだからとfindと書いている可能性はあるんじゃないでしょうか。
むしろRubyに毒されている人は自分でextendすれば良いような。
cells = sheet.cells
cells.extend Enumerable
r = cells.find {|cell|
cell.value == 3
}
#1.9で互換性を捨てるのがOKだからということであれば、良さそうな気もしますが、小文字のfindメソッドを持つコンポーネント(Automationの規約違反だけど大文字小文字意識しないのだから当然あってもおかしくはない)の場合、困るでしょう。その場合は、大文字でFindと書く? (Automationメソッドはすべて先頭は大文字で書けという縛りならそれはそれで良いと思います。Rubyのメソッド名の標準とも衝突しないし)
投稿: arton | 2006年9月30日 (土) 10時22分
小文字だけのAutomationメソッドも作れますからねえ。やっぱり現状維持が妥当ですかねえ。今の気分は現状維持が優勢です。
ちなみに1.8での変更は考えていませんでした。やるとすれば、1.9以降です。
投稿: suke | 2006年9月30日 (土) 12時52分