`
Anleb
  • 浏览: 32437 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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
end

change x
p x
p x.value


p x.object_id
p x.value.object_id


打印:
3
5875824
3
5875824
3
5875704
1
"Mr.w"
3
5875704



大大们再论坛上已经把这个方法传递的是值,还是引用,都说尽了,这里不说基础了。
看代码,如果#x=2不注释,代码的结果又是一种如下:
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值,不知道对不对希望高手来看看。
分享到:
评论

相关推荐

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

    ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码ruby代码

    ruby测试代码6

    标题“ruby测试代码6”和描述“ruby测试代码6”暗示了这是一个关于使用Ruby语言进行的测试代码项目,可能涉及到不同的模块或者数据结构。标签“ruby测试代码6”进一步确认了这一主题。从压缩包子文件的文件名称列表...

    ruby测试代码1

    "ruby测试代码1"可能指的是一个具体的测试用例或者测试框架的实例,用于验证Ruby程序的功能和性能。Ruby提供了多种测试工具,如MiniTest、RSpec和Cucumber等,它们各自有其特点和适用场景。 MiniTest是Ruby标准库的...

    ruby+selenium-webdriver测试--多个测试用例源代码

    在Ruby编程语言中,Selenium-Webdriver是一个强大的工具,用于进行自动化Web浏览器测试。它允许开发者编写脚本来模拟用户与网页的交互,从而验证应用的功能和行为。本篇文章将深入探讨如何使用Ruby和Selenium-...

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

    ruby源代码 ruby源代码 ruby源代码 ruby源代码2

    ruby测试代码7

    "Ruby测试代码7"可能指的是一个特定的测试用例或测试框架在Ruby中的应用。在这个场景下,我们将深入探讨Ruby中的测试实践,包括测试工具、测试方法以及如何通过Map和Sound等模块进行测试。 首先,Ruby中的测试文化...

    ruby源代码 ruby源代码 ruby源代码 ruby源代码4

    ruby源代码 ruby源代码 ruby源代码 ruby源代码4

    ruby+selenium-webdriver测试--第一个例子源代码

    在这个“ruby+selenium-webdriver测试--第一个例子源代码”中,我们将探讨如何使用Ruby和Selenium-Webdriver实现自动化测试的初步步骤。 首先,我们需要安装必要的库。确保已经安装了Ruby,并通过RubyGems来安装...

    ruby源代码 ruby源代码 ruby源代码 ruby源代码3

    ruby源代码 ruby源代码 ruby源代码 ruby源代码3

    ruby+selenium-webdriver测试-测试用例源代码

    Ruby 和 Selenium-Webdriver 是一种强大的组合,用于自动化 Web 应用程序的测试。这篇博客主要探讨了如何利用这两种工具来编写测试用例,并提供了源代码示例。在这个压缩包中,我们有一个名为 "test002" 的文件,很...

    ruby测试代码4

    总之,"ruby测试代码4"这个主题涵盖了Ruby语言的测试实践,包括使用RSpec或Minitest编写测试用例,使用数据文件进行数据驱动测试,以及如何利用覆盖率工具和持续集成服务来提升测试效率和代码质量。对于开发者来说,...

    ruby测试代码2

    "ruby测试代码2"可能指的是一个Ruby项目的测试部分,它包含了多个用于验证代码功能的测试用例。 在Ruby中,测试通常通过测试框架来组织和执行。例如,Ruby on Rails项目常常使用RSpec或Minitest这样的测试库。这些...

    ruby源代码 ruby源代码 ruby源代码 ruby源代码5

    4. 块和闭包:Ruby中的块是一段可以被传递、存储和执行的代码,与闭包紧密相关,支持函数式编程风格。 5. 自动内存管理:Ruby采用垃圾回收机制,自动处理内存分配和释放,减少了内存泄漏的风险。 6. 标准库:Ruby...

    ruby测试代码5

    "ruby测试代码5"可能是一个关于Ruby编程的测试项目,可能包含了对特定功能或者模块的验证和调试。下面将详细讨论Ruby测试、代码组织结构以及与"Floor", "Weapon", "Rpg"相关的编程概念。 首先,测试在软件开发中至...

    ruby+selenium-webdriver测试源代码003

    在本资源中,我们关注的是使用Ruby和Selenium-Webdriver进行自动化测试的源代码,具体为"test003"。Ruby是一种流行的、动态的、面向对象的编程语言,而Selenium-Webdriver则是一个强大的工具,允许我们对浏览器进行...

    学习ruby单元测试小结

    在编程领域,单元测试是一种非常重要的实践,它能确保代码的正确性和稳定性。在Ruby语言中,Test::Unit是用于编写单元测试的标准库。本文将深入探讨Ruby单元测试,特别是Test::Unit框架,并结合学习过程中的体验进行...

    Ruby-Referral一个命令行工具用于查找过滤和排序Ruby代码的定义和引用

    Ruby是一种面向对象的编程语言,以其简洁和表达性强的特点深受开发者喜爱。在处理大型或复杂的Ruby项目时,理解和导航代码库变得尤为重要。"Ruby-Referral"是一个专门为Ruby开发者设计的命令行工具,旨在简化这一...

    ruby测试代码8.rar

    标题 "ruby测试代码8.rar" 暗示这是一个与Ruby编程语言相关的测试代码集合,可能是为了验证特定功能或实现特定逻辑而编写的。这个压缩包可能包含若干个Ruby脚本文件,用于展示或执行测试场景。 描述中的内容 "ruby...

    ruby实战书、代码书.rar

    Ruby是一种面向对象的编程语言,以其简洁、优雅的语法和强大的元编程能力而闻名。这本书籍集合包含了两本关于Ruby的实用书籍——"Ruby程序设计"和"the+ruby+way",它们都是深入理解并提升Ruby编程技能的宝贵资源。 ...

Global site tag (gtag.js) - Google Analytics