查看: 2301|回复: 3

[已经解决] [Cache类问题]关于clone

[复制链接]
梦石
0
星屑
49
在线时间
157 小时
注册时间
2013-8-14
回帖
155
发表于 2013-8-23 01:16:59 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 九靈 于 2013-8-23 01:20 编辑

[pre lang="ruby" line="1"]module RPG
  module Cache
    @Cache = {}
    def self.load_bitmap(folder_name, filename, hue = 0)
      path = folder_name + filename
      if not @cache.include?(path) or @cache[path].disposed?
        if filename != ""
          @cache[path] = Bitmap.new(path)
        else
          @cache[path] = Bitmap.new(32, 32)
        end
      end
      if hue == 0
        @cache[path]
      else
        key = [path, hue]
        if not @cache.include?(key) or @cache[key].disposed?
          @cache[key] = @cache[path].clone
          @cache[key].hue_change(hue)
        end
        @cache[key]
      end
    end
[/pre]
第18行的
@cache[key] = @cache[path].clone
clone 是必要吗?
何不直接
@cache[key] = @cache[path] 呢?
换句话说
一般而言 clone 的目的是什么?

点评

泥煤我纯水也要说一句,你丫的刷帖0.0  发表于 2013-8-23 09:51
梦石
0
星屑
50
在线时间
466 小时
注册时间
2013-2-8
回帖
420
发表于 2013-8-23 07:57:16 来自手机 | 显示全部楼层
复制一个副本而不是直接引用
回复

使用道具 举报

梦石
0
星屑
122
在线时间
552 小时
注册时间
2012-8-18
回帖
1392
发表于 2013-8-23 08:11:31 | 显示全部楼层
如果不clone 那么当这个Bitmap被两个Sprite引用,那么将会出现一些无法预料的错误
举例:
  1. a = Sprite.new
  2. b = Sprite.new
  3. c = Bitmap.new("...")
  4. a.bitmap = c
  5. b.bitmap = c
  6. a.bitmap.clear #此时由于是同一个Bitmap导致b的显示也被清空
  7. b.bitmap.dispose #此时这个Bitmap被释放
  8. a.bitmap.clear #由于对释放的Bitmap进行操作而导致出错
复制代码
总之除了Fixnum Symbol以外 传递的过程中是赋值而不是复制 而clone和dup就是用来解决这个问题的

点评

原来如此...感谢!  发表于 2013-8-23 13:11

评分

参与人数 1星屑 +100 收起 理由
︶ㄣ牛排ぶ + 100 认可答案

查看全部评分

我要填坑!我要背单词!我要学日语!我要每天锻炼!
好吧呵呵= =
回复

使用道具 举报

梦石
0
星屑
49
在线时间
157 小时
注册时间
2013-8-14
回帖
155
 楼主| 发表于 2013-8-23 13:08:14 | 显示全部楼层
刷帖非本意啊
再说经验啥的我不再乎
我是真的有问题啊
再说6R上也没人问
那我只能发帖了
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部