设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 2049|回复: 2
打印 上一主题 下一主题

[讨论] 有關變量/對象被改變的捕捉方法??

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
62 小时
注册时间
2011-1-28
帖子
35
跳转到指定楼层
1
发表于 2013-8-2 12:09:34 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
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. 如果看不懂我的第二個方案就直接無視了吧.. 應該也不會造成理解上的問題@.@
头像被屏蔽

Lv2.观梦者 (禁止发言)

梦石
0
星屑
653
在线时间
3774 小时
注册时间
2011-2-26
帖子
1839

开拓者

2
发表于 2013-8-2 14:54:19 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
62 小时
注册时间
2011-1-28
帖子
35
3
 楼主| 发表于 2013-8-3 00:17:51 | 只看该作者
本帖最后由 nokaiwai 于 2013-8-3 15:30 编辑

謝謝  晴兰  大大提供的方案
的確比原本方便了不少
這個方案已經在用了
但是還想再問一下
不手動找出破坏性方法 直接捕捉對象的改變 有可能做到嗎?

点评

牺牲效率的话。。对每个方法都当做可能是有破坏性的方法包装一下。。这样也能批量做  发表于 2013-8-16 20:02
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2024-11-26 01:48

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表