赞 | 2 |
VIP | 143 |
好人卡 | 1 |
积分 | 1 |
经验 | 216792 |
最后登录 | 2019-10-10 |
在线时间 | 24 小时 |
Lv1.梦旅人
- 梦石
- 0
- 星屑
- 61
- 在线时间
- 24 小时
- 注册时间
- 2008-8-5
- 帖子
- 1924
|
但是帮助里面是将"我是" + @name + ""作为一个字符串整体“ + @name +”是一个内嵌字符串(本人真是这样理解的- -b) 否,内嵌字符串是 "我是#{@name}" 这样~
而print"我是" + @name则是将"我是" 和 @name作为两个不同的类处理,运行结果会一样是因为他们有一个共同的obj父类,该父类又支持+方法 否,"+" 是 String 类的一个方法(可以看作一个 Ruby 的重载运算符),它的参数只能是一个 String 类型的对象~
"我是" 是一个 String 类型的实例;
"我是" + @name 调用了 String 的 + 方法,在 "我是" 末尾连接上 @name 这个字符串并返回一个新的 String 对象;
"我是" + @name + "" 在上面第一次调用 "+" 后返回的 String 对象基础上再次调用 "+",连接上一个空字符串,这时又会返回一个新的 String 对象,虽然内容和本次 "+" 调用之前的字符串一模一样,但其实在内存中已经是两个不同的对象了
无论从空间还是速度方面考虑,后者效率都是低于前者的~不过在硬件飞速发展的今天,这个差别实在不是地球人能够分辨地出来的……
请注意一句 只要其对象存在,变量的值就会被保存。
这就是说(举上面的例子)如果我们在游戏的进程中将作为person类的alex实例(由于各种七七八八的原因不小心还是有意)删掉了,那么作为alex的name的属性值"艾力克斯"将会被系统清空
回到nil状态,这样就能减少一点内存了(超级抠门- -b)
而如果将alex的name的属性值存为一个全局变量,那就是不管alex死了没有系统始终存在一个叫
"艾力克斯"的全局变量(真是太浪费了- -b)
好像就是这么理解的,好像- -b
这个其实不用你操心,Ruby 的对象析构已经由垃圾回收机制帮你做了,所以 Ruby 中反而没有提供显示的方式让程序员去释放内存
另外有一点最好弄清楚,所谓的变量,实际上不是“保存”值,而是“指向”或者“引用”值,真正“保存”了值的是内存,而变量则是指向了某个内存地址。不过平时我们讨论的时候通常也说“让变量保存XXX”,这只是为了让更多人理解而已~
举个例子:var = 1 # 让引用 var 引用内存中 Fixnum 类的单一实例 "1"
var = Object.new # 让 var 引用刚在内存中分配的一个 Object 对象
var = true # 让 var 引用到 TrueClass 类的单一实例 true
var = nil # 让 var 引用到 NilClass 类的单一实例 nil 所以 var = nil 并不代表 var 之前引用的对象被销毁了,而只是让之前引用的对象失去了引用,之后该对象在适当的场合就会被垃圾回收器回收 系统信息:本贴由楼主认可为正确答案,66RPG感谢您的热情解答~ |
|