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... ]