[前][次][番号順一覧][スレッド一覧]

learn-ruby-in-kansai:205

From: tomoya <tomoya@c...>
Date: Sun, 23 Jan 2005 18:15:18 +0900
Subject: [learn-ruby-in-kansai:205] delegate について

Cuzic です。

昨日の講義中での質問などについて書きます。

* delegate のところについて
** 口頭で方法は 4 つありますと言っていたこと
次の4つです。Ruby レシピブックの 399 ページに詳しくあります。

- 自分で書く
- forwardable を使う
- delegate を使う
- 今回の module と method_missing による解

** ループでまわすと delegate のコードが動かない点について
おそらく、Worksheet のモジュールを改変すると、良いのではないかと
思います。バグがあればまたお知らせください。

module Worksheet
  def [] y,x
    cell = self.Cells.Item(y,x)
    v = cell.Value
    return v if v.respond_to?("cell=") # この行を追加

    def v.cell= cell
      @cell = cell
    end
    v.cell = cell
    def v.method_missing(name,*args)
      @cell.__send__(name,*args)
    end
    return v
  end
end

** 今回の module と method_missing による解は遅いのでは?
後から考え直したのですが、まさーるさんのホームページにあるように
Lookup Cache パターンを利用して、一度アクセスしたことがあるセルを
メモリに保持し続けるようにするともっと速くなりますね。
http://homepage3.nifty.com/masarl/article/ruby-win32ole/excel-2.html

** 今回の解を delegate ライブラリで実現できるか
いろいろ考えたところ、単純な delegate だったら確かに実現できるものの、
たとえば、String を String のまま、Integer を Integer のままにしながら、
なおかつ delegate させようとするような要求があれば、今回の解は
うまく動かないように思います。

sheet[1,1].Font.Size などと実行できて、なおかつ sheet[1,1].Value
ではなく sheet[1,1] で値の取得を行いたいということであれば、
今回のやり方を使うことになるのではないでしょうか?


ほかに勉強会で質問しようと思っていたが聞けなかったことがありましたら
メーリングリストでも DM でも受け付けて答えます。
何かありましたら、是非 お聞かせください。

よろしくお願いします。

-- 
Cuzic <tomoya@c...>
http://www.cuzic.com/



--
ML: learn-ruby-in-kansai@r...
使い方: http://QuickML.com/

[前][次][番号順一覧][スレッド一覧]

->     205 2005-01-23 10:15 [tomoya@c...         ] delegate について                       
       206 2005-01-23 14:26 ┗[sakai-n@m...        ]                                       
       207 2005-01-23 15:51  ┗[tomoya@c...         ]