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

ruby-reference-manual:260

From: okkez <okkez000@g...>
Date: Thu, 4 Jan 2007 21:42:38 +0900
Subject: [ruby-reference-manual:260] TclTkIpの特異メソッドとinstance_eval

okkezです。

# tk.rb 色々と難しいです。

ちょっと、どう書くべきか悩んでいる部分があるので相談させてください。
ちょっと長いですがソースコードを一部引用します。

以下のような感じで、instance_eval内でクラスメソッドとインスタンスメソッドが定義されています。
この場合は、どこにどう書けばいいでしょうか。
また、その直後で def INTERP.hogehoge
というパターンで特異メソッドの追加が続いているのですが、こちらは普通にTclTkIpクラスの特異メソッドとして記述しておけばいいのでしょうか。

== Singleton Methods
--- cb_entry_class

みたいな感じです。

---- tk.rb ----
module TkCore
  include TkComm
  extend TkComm

  unless self.const_defined? :INTERP
    if self.const_defined? :IP_NAME
      name = IP_NAME.to_s
    else
      #name = nil
      name = $0
    end
    if self.const_defined? :IP_OPTS
      if IP_OPTS.kind_of?(Hash)
        opts = hash_kv(IP_OPTS).join(' ')
      else
        opts = IP_OPTS.to_s
      end
    else
      opts = ''
    end

    INTERP = TclTkIp.new(name, opts)

    def INTERP.__getip
      self
    end

    INTERP.instance_eval{
      @tk_cmd_tbl = {}.taint
      def @tk_cmd_tbl.[]=(idx,val)
        if self.has_key?(idx) && Thread.current.group != ThreadGroup::Default
          fail SecurityError,"cannot change the entried command"
        end
        super(idx,val)
      end

      @tk_windows = {}.taint

      @tk_table_list = [].taint

      @init_ip_env  = [].taint  # table of Procs
      @add_tk_procs = [].taint  # table of [name, args, body]

      @cb_entry_class = Class.new(TkCallbackEntry){
        class << self
          def inspect
            sprintf("#<Class(TkCallbackEntry):%0x>", self.__id__)
          end
          alias to_s inspect
        end

        def initialize(ip, cmd)
          @ip = ip
          @cmd = cmd
        end
        attr_reader :ip, :cmd
        def call(*args)
          @ip.cb_eval(@cmd, *args)
        end
        def inspect
          sprintf("#<cb_entry:%0x>", self.__id__)
        end
        alias to_s inspect
      }.freeze
    }

    def INTERP.cb_entry_class
      @cb_entry_class
    end
    def INTERP.tk_cmd_tbl
      @tk_cmd_tbl
    end
    def INTERP.tk_windows
      @tk_windows
    end
# 略
----- ここまで。

-- 
okkez
okkez000@g...

--
ML: ruby-reference-manual@m...
使い方: http://QuickML.com/

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

->     260 2007-01-04 13:42 [okkez000@g...       ] TclTkIpの特異メソッドとinstance_eval    
       261 2007-01-04 14:14 ┗[don@n...            ]                                       
       262 2007-01-04 15:13  ┣[okkez000@g...       ]                                     
       265 2007-01-04 23:12  ┗[aamine@l...         ]                                     
       267 2007-01-05 06:50   ┗[okkez000@g...       ]                                   
       269 2007-01-05 11:13    ┗[aamine@l...         ]