Project1
标题: 有關變量/對象被改變的捕捉方法?? [打印本页]
作者: nokaiwai 时间: 2013-8-2 12:09
标题: 有關變量/對象被改變的捕捉方法??
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. 如果看不懂我的第二個方案就直接無視了吧.. 應該也不會造成理解上的問題@.@
作者: 晴兰 时间: 2013-8-2 14:54
提示: 作者被禁止或删除 内容自动屏蔽
作者: nokaiwai 时间: 2013-8-3 00:17
本帖最后由 nokaiwai 于 2013-8-3 15:30 编辑
謝謝 晴兰 大大提供的方案
的確比原本方便了不少
這個方案已經在用了
但是還想再問一下
不手動找出破坏性方法 直接捕捉對象的改變 有可能做到嗎?
欢迎光临 Project1 (https://rpg.blue/) |
Powered by Discuz! X3.1 |