Project1

标题: 有關變量/對象被改變的捕捉方法?? [打印本页]

作者: nokaiwai    时间: 2013-8-2 12:09
标题: 有關變量/對象被改變的捕捉方法??
RUBY 代码复制
  1. class Frame
  2.   def initialize(size,*arg)
  3.     @width = Array.new(size) {|x| arg[x] || 32 }
  4.   end
  5.   def width
  6.     @width
  7.   end
  8.   def width=(value)
  9.     @width = value
  10.   end
  11.   def width_update
  12.     ##
  13.     ##
  14.     ##
  15.     ##
  16.     ##
  17.   end
  18. end

對於捕捉@width被改變的方法...我想到兩個方法


第一個是在每幀調用一個方法,比較@width與之前的@width是否改變。
RUBY 代码复制
  1. def update
  2.   width_update if @width == @old_width
  3.   @old_width = @width
  4. end

這樣的話,變量和對象的改變都可以直接捕捉到
但是要多用一倍的內存記錄舊的值...


第二個是把變量和對象的改變分開捕捉
RUBY 代码复制
  1. class Frame
  2.   def initialize(size,*arg)
  3.     @width = Array.new(size) {|x| arg[x] || 32 }
  4.     set_class_width
  5.   end
  6.   def width
  7.     @width
  8.   end
  9.   def width=(value)
  10.     @width = value
  11.     set_class_width ## 對象改變的捕捉
  12.     width_update ## 變量改變的捕捉
  13.   end
  14.   def set_class_width
  15.     class << @width
  16.       alias clear_basic clear
  17.       alias collect_basic! collect!
  18.       alias compact_basic! compact!
  19.       alias concat_basic concat
  20.       alias delete_if_basic delete_if
  21.       alias fill_basic fill
  22.       ##
  23.       ##
  24.       ##
  25.       ##
  26.       ##
  27.       def clear(*arg,&blk)
  28.         clear_baisc(*arg,&blk)
  29.         width_update
  30.       end
  31.       def collect!(*arg,&blk)
  32.         collect_baisc!(*arg,&blk)
  33.         width_update
  34.       end
  35.       ##
  36.       ##
  37.       ##
  38.       ##
  39.       ##
  40.     end
  41.   end
  42.   def width_update
  43.     ##
  44.     ##
  45.     ##
  46.     ##
  47.     ##
  48.   end
  49. 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