• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

Ruby中的深浅拷贝

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

  今天在写程序时,发现有两个测试单独运行通过,但一起运行时第二个测试老挂。不用说,产生了依赖了么,找了半天,找到这么两句。

line_string = @@digital_lines[item][line_number]
...
line_string.insert(1,"  ")

  在irb中测试了一下,原来line_string只是一个指针呀,直接就把原始数据给修改了,这不就是鼎鼎大名的深浅拷贝么,汗~~~

  没办法,在Google上面搜了一下,使用了Object中的dup方法,该方法类似于clone方法,返回一个相同值的全新对象,完成深拷贝,参考如下:

ruby-1.8.7-p330 :010 > a = "123"
 => "123" 
ruby-1.8.7-p330 :011 > b = a.dup
 => "123" 
ruby-1.8.7-p330 :012 > a.object_id
 => 2149191580 
ruby-1.8.7-p330 :013 > b.object_id
 => 2149174920 

  可以看出,a和b时两个不同的对象,当然也就不存在相互影响的情况了。

  大功告成了么?No, no, no. 好戏还没有结束,各位看官请往下看  

ruby-1.8.7-p330 :062 > a = [["abc"]]
 => [["abc"]] 
ruby-1.8.7-p330 :063 > b = a.dup
 => [["abc"]] 
ruby-1.8.7-p330 :064 > a.object_id
 => 2149153820 
ruby-1.8.7-p330 :065 > b.object_id
 => 2149144160 
ruby-1.8.7-p330 :066 > a[0][0] = 1
 => 1 
ruby-1.8.7-p330 :067 > a
 => [[1]] 
ruby-1.8.7-p330 :068 > b
 => [[1]]

  虽然调用了dup方法产生了不同的对象,但还是出现了浅拷贝的情况(当a[0][0]=1时,b的值也变了)。同样的情况还出现在Hash和我们自定义的类中。

  想一想我们在C++和Java中时如何解决这个问题的?聪明的你一定想到了吧,既然系统自带的不给力,咱就自己写一个吧。实际上,已经有牛人写好了,我们直接用就行了,嘿嘿~~

  参考如下:http://www.artima.com/forums/flat.jsp?forum=123&thread=40913

  

class Object
      def dclone
        case self
          when Fixnum,Bignum,Float,NilClass,FalseClass,
               TrueClass,Continuation
            klone = self
          when Hash
            klone = self.clone
            self.each{|k,v| klone[k] = v.dclone}
          when Array
            klone = self.clone
            klone.clear
            self.each{|v| klone << v.dclone}
          else
            klone = self.clone
        end
        klone.instance_variables.each {|v|
          klone.instance_variable_set(v,
            klone.instance_variable_get(v).dclone)
        }
        klone
      end
    end

  还等什么,赶紧Command+C走吧~~~

PS:前文提到了dup和clone差不多,那Object中的dup和clone的区别是什么呢?

答案在这里,需要饭强哦(fan qiang是敏感词。。。)。

  


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Ruby:字符串处理函数发布时间:2022-07-14
下一篇:
Ruby on rails初体验(一)发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap