设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 949|回复: 9
打印 上一主题 下一主题

这两种写法对以后的影响有什么区别

 关闭 [复制链接]

Lv1.梦旅人

梦石
0
星屑
60
在线时间
1 小时
注册时间
2008-11-7
帖子
9
跳转到指定楼层
1
发表于 2009-6-9 07:25:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
class Person
  def name
    return@name
  end
  def name=(name)
    @name=name
  end
  def hello
    print"我是" + @name + ""
  end
end

alex = Person.new
alex.name= "艾力克斯"
alex.hello                  # => 我是艾力克斯
   




class Person
  def name
    return@name
  end
  def name=(name)
    @name=name
  end
  def hello
    print"我是" + @name
  end
end

alex = Person.new
alex.name= "艾力克斯"
alex.hello                  # => 我是艾力克斯



关于实变量和全局变量该怎么理解和区分?看了帮助后还是不能理解透彻,麻烦知道的兄弟解答一下,谢谢了
版务信息:本贴由楼主自主结贴~
rrrrrr---rpg!!!!!

Lv4.逐梦者

梦石
0
星屑
7986
在线时间
1184 小时
注册时间
2007-7-29
帖子
2055
2
发表于 2009-6-9 08:05:19 | 只看该作者
全局变量何时都能够更改的说……
还有,LZ说的不同,我只找到:
print"我是" + @name + "" 和 print"我是" + @name
而已。
这两点,理论上没有不同。
尝试简略lz的脚本:
class Person
attr_accessor :name
def hello
   print "我是" + @name
end
end
alex = Person.new
alex.name = "艾力克斯"
alex.hello # => 我是艾力克斯
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
1 小时
注册时间
2008-11-7
帖子
9
3
 楼主| 发表于 2009-6-9 18:16:43 | 只看该作者
兄弟非常感谢你那么晚了还回贴,感动一个先{/dk}
你说的我都已经知道了,但是为什么在帮助文件里面不用 print"我是" + @name
难道帮助的作者耍帅....- -b
两种情况还是有差别的虽然看起来结果是一样的
但是帮助里面是将"我是" + @name + ""作为一个字符串整体“ + @name +”是一个内嵌字符串(本人真是这样理解的- -b)
而print"我是" + @name则是将"我是" 和 @name作为两个不同的类处理,运行结果会一样是因为他们有一个共同的obj父类,该父类又支持+方法
很明显第二种方法简单又明了的多(作为一个初次接触程序的菜鸟来说)
不知道是不是这样....
两种写法对以后程序的运行有什么不同呢?
我的理解是这样的,先看帮助的原文:
    属于个体对象的变量称为实变量。名称以 @ 开头的变量,自动作为实变量使用。局部变量只有在 def ~ end 等结构内部使用时才有效,然而使用实变量的话,只要其对象存在,变量的值就会被保存。
请注意一句  只要其对象存在,变量的值就会被保存。
这就是说(举上面的例子)如果我们在游戏的进程中将作为person类的alex实例(由于各种七七八八的原因不小心还是有意)删掉了,那么作为alex的name的属性值"艾力克斯"将会被系统清空
回到nil状态,这样就能减少一点内存了(超级抠门- -b)
而如果将alex的name的属性值存为一个全局变量,那就是不管alex死了没有系统始终存在一个叫
"艾力克斯"的全局变量(真是太浪费了- -b)
好像就是这么理解的,好像- -b
rrrrrr---rpg!!!!!
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦·贤者

梦石
0
星屑
50
在线时间
1141 小时
注册时间
2007-12-15
帖子
4100
4
发表于 2009-6-9 18:34:00 | 只看该作者
个人觉得若不是非要全局性地修改,没必要搞成全局变量
默认的全局变量也只有$BTEST $DEBUG等吧= =
http://rpg.blue/home.php?mod=space&uid=34951&do=blog&id=12799
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
5
发表于 2009-6-9 18:58:37 | 只看该作者
但是帮助里面是将"我是" + @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感谢您的热情解答~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦·贤者

梦石
0
星屑
50
在线时间
1141 小时
注册时间
2007-12-15
帖子
4100
6
发表于 2009-6-9 19:04:56 | 只看该作者
再次受教了,紫苏大~
http://rpg.blue/home.php?mod=space&uid=34951&do=blog&id=12799
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
0 小时
注册时间
2007-6-3
帖子
522
7
发表于 2009-6-9 19:09:41 | 只看该作者
那Ruby里有StringBuilder吗?{/yiw}
啊……正太好可爱啊~~~~ 偶死了,2009年重生
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
61
在线时间
24 小时
注册时间
2008-8-5
帖子
1924
8
发表于 2009-6-9 19:12:11 | 只看该作者
以下引用tommay于2009-6-9 11:04:56的发言:

再次受教了,紫苏大~

客气!
其实预定义的全局变量巨多:
p global_variables

以下引用华华于2009-6-9 11:09:41的发言:

那Ruby里有StringBuilder吗?

标准库中应该没有~
要实现应该也不难,用 C++ 设计一个类,自始至终都操作同一块通过 new char[] 分配的内存就能实现 StringBuilder 了,然后再通过 API 应用到 Ruby 中
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
60
在线时间
1 小时
注册时间
2008-11-7
帖子
9
9
 楼主| 发表于 2009-6-9 19:14:01 | 只看该作者
有点深奥,不过还是多谢紫苏大指出了其中奥秘,如果基础不搞好的话以后的深入会很麻烦的说,所以很重要,再次感谢紫苏大{/qiang}{/qiang}
rrrrrr---rpg!!!!!
回复 支持 反对

使用道具 举报

头像被屏蔽

Lv1.梦旅人 (禁止发言)

梦石
0
星屑
50
在线时间
21 小时
注册时间
2007-7-3
帖子
573
10
发表于 2009-6-9 19:55:59 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
签名被屏蔽
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2025-1-27 19:30

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表