加入我们,或者,欢迎回来。
您需要 登录 才可以下载或查看,没有帐号?注册会员
x
class Frame def initialize(size,*arg) @width = Array.new(size) {|x| arg[x] || 32 } end def width @width end def width=(value) @width = value end def width_update ## ## ## ## ## end end
class Frame
def initialize(size,*arg)
@width = Array.new(size) {|x| arg[x] || 32 }
end
def width
@width
end
def width=(value)
@width = value
end
def width_update
##
##
##
##
##
end
end
對於捕捉@width被改變的方法...我想到兩個方法
第一個是在每幀調用一個方法,比較@width與之前的@width是否改變。
def update width_update if @width == @old_width @old_width = @width end
def update
width_update if @width == @old_width
@old_width = @width
end
這樣的話,變量和對象的改變都可以直接捕捉到
但是要多用一倍的內存記錄舊的值...
第二個是把變量和對象的改變分開捕捉
class Frame def initialize(size,*arg) @width = Array.new(size) {|x| arg[x] || 32 } set_class_width end def width @width end def width=(value) @width = value set_class_width ## 對象改變的捕捉 width_update ## 變量改變的捕捉 end def set_class_width class << @width alias clear_basic clear alias collect_basic! collect! alias compact_basic! compact! alias concat_basic concat alias delete_if_basic delete_if alias fill_basic fill ## ## ## ## ## def clear(*arg,&blk) clear_baisc(*arg,&blk) width_update end def collect!(*arg,&blk) collect_baisc!(*arg,&blk) width_update end ## ## ## ## ## end end def width_update ## ## ## ## ## end end
class Frame
def initialize(size,*arg)
@width = Array.new(size) {|x| arg[x] || 32 }
set_class_width
end
def width
@width
end
def width=(value)
@width = value
set_class_width ## 對象改變的捕捉
width_update ## 變量改變的捕捉
end
def set_class_width
class << @width
alias clear_basic clear
alias collect_basic! collect!
alias compact_basic! compact!
alias concat_basic concat
alias delete_if_basic delete_if
alias fill_basic fill
##
##
##
##
##
def clear(*arg,&blk)
clear_baisc(*arg,&blk)
width_update
end
def collect!(*arg,&blk)
collect_baisc!(*arg,&blk)
width_update
end
##
##
##
##
##
end
end
def width_update
##
##
##
##
##
end
end
所謂對象改變的捕捉就是把所有破壞性方法重新定義成運行後立即調用width_update
而變量改變的捕捉就是指向的對象改變時(即調用「width=」方法時)調用width_update
這個方案因為直接修改方法內容,應該比第一個方案好。
但是要把所有Array的破壞性方法找出來再修改也太笨了吧-.-?
有沒有其他比較聰明的方案呢???
P.S. 如果看不懂我的第二個方案就直接無視了吧.. 應該也不會造成理解上的問題@.@ |