最近在看ruby,看到了一个关于引用的问题。先看下面一段代码:
#song.rb
class Song
def initialize(name,artist,duration)
@name = name
@artist = artist
@duration = duration
end
def name
@name
end
end
上面定义了一个叫Song的类,方法name会返回name的值。然后:
#file.rb
if __FILE__ == $0
require 'song.rb'
song = Song.new("Bicyclops","Fleck",260)
tmp1 = song.name
tmp1 = "Tom"
print song.name + "\n"
print "###############\n"
tmp2 = song.name
tmp2[0] = "D"
print song.name
end
运行代码会输出:
Bicyclops
###############
Dicyclops
tmp1和tmp2的值都是来自于song.name的返回值。然而修改tmp1后打印song.name并没有改变,而修改tmp2后打印song.name的值改变了,为什么哪?
我的理解是 tmp1 = "Tom" 这句话是先新建了一个值为“Tom”的字符串对象,然后将其引用赋给tmp1,因此tmp1与song对象的name已经是不同的引用,无论tmp1的值如何改变,song的name属性都不会变。
而tmp2[0]=“D”的操作不同,tmp2仍然与name是同一个引用,因此修改操作tmp2会引起name的同步变化。
以前无论在java还是c++编程中,为了保证数据的安全往往将数据设为私有并单独写访问器来访问数据。但是在ruby中字符串是可以更改的,像上面设定访问器仍可以在外部改变成员变量的值。因此有必要做一些改变:
def name
@name.dup
end
将name方法按照上面这么写,会在返回name的时候做一次拷贝,返回和name不同的引用,这样就不会引起上面的问题了。
分享到:
相关推荐
主要介绍了Ruby中变量引用时的一些注意点,被当作变量或被当作方法调用的情况,需要的朋友可以参考下
Referral是一个CLI,可帮助您进行Ruby代码库的复杂分析和重构。 它在整个代码中查找,过滤和排序大多数类型的Ruby标识符(例如类,方法和变量)的定义和引用。
Active Storage 使得在Rails应用中能够很方便上传和引用云服务中的文件,像Amazon S3或Google Cloud Storage,并将这些文件附加到Active Records中。 它还提供用于测试或本地部署的磁盘服务,但重点是云存储。
Charley Baker Lead Developer, Watir, http://watir.com - 隐藏被引用文字 -- 显示引用的文字 -On Thu, Sep 2, 2010 at 12:20 PM, chaitanya <vengeance...@gmail.com> wrote: > Hi every1, > I am new to Watir ...
在对Ruby进行了简要的综述之后,《Ruby编程语言》详细介绍了以下内容:Ruby的句法和语法结构,数据结构和对象,表达式和操作符,语句和控制结构,方法、proc、lambda和闭包,反射和元编程,Ruby平台。本书还包含对...
PyCall:从Ruby语言中调用Python函数该库提供了直接从Ruby语言中调用Python并与之进行部分互操作的功能。 您可以在PyCall中导入任意Python模块:从Ruby语言调用Python函数该库提供了直接从Ruby语言调用Python并与之...
CiteProc-Ruby是用纯Ruby编写的(CSL)1.0.1引用处理器。 这个Ruby宝石仅包含处理器的渲染引擎。 有关整个cite处理器的更多文档,请参阅 gem的文档。 快速开始 安装CiteProc-Ruby和所有正式的CSL样式(可选)。 $...
代码及图片资源引用 v2ex by greatyao rubychina4android by gonjay google design icons 屏幕截图 LICENSE Copyright (C) 2015 xialincn This program is free software: you can redistribute it and/or ...
同一目录下的文件,如/usr/local/ruby/foo.rb与/usr/local/ruby/bar.rb两个文件。...所以除引用系统rb外,require中不能用相对路径。 下面结合我个人经验介绍几种引用单个和目录下所有rb的方法。 1、
常数定义枚举,并将其作为常量引用。 class OrderState include Ruby :: Enum define :CREATED , 'created' define :PAID , 'paid'end OrderState :: CREATED # 'created'OrderState :: PAID # 'paid'OrderState ::...
在您的 Dockerfile 中引用预构建的镜像作为基础 FROM invisiblelines/ruby:2.2.0 构建镜像 $ git clone https://github.com/invisiblelines/docker-ruby.git $ cd docker-ruby $ docker build -t ruby:2.2.0 . ...
一些逻辑和算法是其他作者的摘录或改编,在注释中引用。 该软件是根据MIT许可发布的。安装将此行添加到您的应用程序的Gemfile中: gem 'ruby-statistics' 然后执行: $ bundle或将其自己安装为: $ gem install ...
编程基础阅读物(翻译未完),主要是Ruby示例、其他引用,内容包括了线程、固定规则、设计模式,数据结构、算法
引用Totodo's Blog的内容: 最终不还是 HTML,CSS,JavaScript么,换了哪个动态脚本语言不行呢? 所谓的低重用性,ROR的无缝集成,几行代码把即把MVC一层统一。 上面的例子,诸多脚本语言PHP,Perl,Python...
查找,过滤和排序定义和整个代码中大多数类型的Ruby标识符(例如,类,方法和变量)的引用。将referal视为一种工具包,用于出于各种目的在代码中跟踪引用,并提供大量命令行选项以使您能够有效完成以下任务:通过...
Ruby洪流 一个简单的用 Ruby 编写的 BitTorrent 客户端。 该客户端可以同时从多个对等点下载单文件或多文件种子。 安装 在本地克隆 ...Ruby 2.0 Torrent 文件必须包含对跟踪器的引用。 尚不支持 DTH 种子文件
本章详细介绍Rails中控制器的使用,包括控制器执行流程、路由配置文件、各种路由的配置、通过控制器定义显示模板、提交数据,以及重定向等。 第12章 MVC的视图层。本章详细介绍Rails中视图层的使用,包括模板的...
日光仪 Ruby语言服务器 Solargraph为Ruby编程提供了一套全面的工具:智能感知,诊断,内联文档和类型检查。 在线演示 可在上获得Solargraph自动完成功能的... 编辑代码时,引用gem的require调用会将文档拉入代码映射,