• ruby一小段代码测测你的引用类型功力


    class Fixnum
       attr_accessor :value
    end
    
    x=1
    p x.object_id
    x.value="Anleb"
    p x.value.object_id
    def change(x)
        p x.object_id   
        p x.value.object_id
        x=2        #指针改变
        x.value="Mr.w"
        p x.object_id
        p x.value.object_id  
        #x改变的指针在这里被GC回收
    end
    
    
    change x
    p x
    p x.value
    p x.object_id
    p x.value.object_id
    打印
    3
    22950360
    3
    22950360
    5
    22950290
    1
    "Anleb"
    3
    22950360
    

     这段代码好理解,因为这就是我们很平常的方法无法改变传递进去的值的案例,具体不说,原因都知道是 方法内部变量改变了指针,退出方法的时候,指针销毁,然后x回到顶级域x又是原来的指针。


    现在来说说,为什么注释掉了#x=2,结果会改变呢,这个问题出在attr_accessor :value
    这个代码相当于:

       def value=(value)
           @value=value
       end
       def value
           @value
       end
    

     注意到没,返回的直接是@value,所以会修改对象里面的value值,不知道对不对希望高手来看看。

    class Fixnum attr_accessor :value end x=1 p x.object_id x.value="Anleb" p x.value.object_id def change(x) p x.object_id p x.value.object_id #x=2 x.value="Mr.w" p x.object_id p x.value.object_id end change x p x p x.value p x.object_id p x.value.object_id #result: 3 5875824 3 5875824 3 5875704 1 "Mr.w" 3 5875704

    大大们再论坛上已经把这个方法传递的是值,还是引用,都说尽了,这里不说基础了。
    看代码,如果#x=2不注释,代码的结果又是一种如下:

  • 相关阅读:
    安装mysql-python:EnvironmentError: mysql_config not found
    github中non-fast-forward错误的解决
    centos 6.X 安装scrapy-原创
    如何解决php 生成验证码图片不显示问题
    Centos 6.4 python 2.6 升级到 2.7
    ubuntu默认防火墙
    Ubuntu 14.04 为 root 帐号开启 SSH 登录
    git配置ssh非默认端口
    jquery 选择器,模糊匹配
    CURD方法盘点:where方法-THINKPHP
  • 原文地址:https://www.cnblogs.com/IAmBetter/p/2963678.html
Copyright © 2020-2023  润新知