蛤蛤 可能是因为我啃太慢了吧 我才到第三章
感谢楼主 最近啃 csapp 有点难受 看了帖子真的坚定了很多
煞笔了煞笔了,我居然自以为这个问题已经被我完美解决了……今天回来逛逛意外的发现完全受教了。真的是非常感谢。
哦,我想起来了,我在 ruby 基础教程看到过,ruby 会对每个对象引用进行计数,如果计数个数变为 0 就会自动释放。完美!
惊了,今天下午上课自己想了一下,然后查了一下相关资料,发现所有传递引用的说法完全可以解释并且行得通。
因为 Array.new(6,[]) 的时候,我传递的是一个数组引用,每一维都指向同一个引用,那么我在这个被引用的数组作修改,的确会影响到其他维数的数组。
而传递 block 的时候,应该是 6 次 Array.new 的时候都重新执行一次 Array.new,那么每一维都指向不同的 new 出来的数组引用。
而大佬你说的数字传递的也是引用问题,我在这里得到了充分解释,并且在我的理解范围内是正确的。
在赋值的时候,ruby 根据右值创建对象并返回该对象的引用,并不论左值是否为空,原引用对象是什么,都会将之覆盖。这种不论左值都可赋值也正是任何变量都是引用的体现是么!!!!
也许我现在才有一点点理解了动态语言,想想有点小激动……
另外的,如果以上成立,那么在 ruby 中,我们创建对象的时候返回引用,因此只能通过引用间接访问。如果一个创建的对象之后我可能不需要了,那么它只能留在那里,我们无法自主删除。然而某些对象比如数字和字符串中会用的比较频繁,那会不会引起一些内存问题呀…………
非常感谢,看来如果要深入学习 ruby 不看文档是不行的
另一方面,Elixir 的话,考虑到现在大二,明年打算去找实习,所以我还是想把更多时间放在基础上。
多谢,将后一个 Array.new 通过块传入的确可以实现我的目的。 但这样定义的时候默认采取引用的方式又有什么好处呢……不是很理解这种机制的目的