• 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不注释,代码的结果又是一种如下:

  • 相关阅读:
    Could not transfer artifact org.apache.maven.plugins:maven-resources-plugin:pom:2.6 from/to central
    SpringMVC详解
    数据库连接池
    事务的隔离级别
    数据库四大特性
    Eclipse自动编码提示设置
    RequestDispatcher.forward转发与HttpServletResponse.sendRedirect重定向
    c#代码混淆
    java反射机制
    (转)redis是什么
  • 原文地址:https://www.cnblogs.com/IAmBetter/p/2963678.html
Copyright © 2020-2023  润新知