幻想森林

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1638|回复: 6

[RM2K&2K3] 几个小白的脚本问题

[复制链接]

6

主题

24

帖子

251

积分

③业余

积分
251
QQ
发表于 2008-8-18 16:59:41 | 显示全部楼层 |阅读模式
1.谁能解释一下return的具体意思
帮助文件中的解释是:结束方法的运行,且把表达式的值设定为方法的返回值。若给出了 2 个以上的表达式,则将这些表达式组成一个数组,然后把该数组设定为方法的返回值。若省略表达式,则返回值为 nil
不太明白所谓的返回值是什么意思,谁能详细的解释一下?
2.关于attr_accessor
在帮助文件里举了一个例子:
def name
    return @name
  end
  def name=(name)#别搞错了,这个方法名字是name=(name)是附加属性
    @name = name
  end
关于这一段代码谁能详细的解释一下它的意思?还有,附加属性到底有什么用?
小人拜谢个位大仙了!
回复

使用道具 举报

2

主题

94

帖子

1万

积分

⑧专业

S星王

积分
19631
发表于 2008-8-18 17:42:05 | 显示全部楼层
  1. def get_sth
  2.     return 1
  3. end
  4. print get_sth # 这里方法get_sth return返回1,因此打印出1,这就是返回值
复制代码

帮助上写的是这样吧……
  1. def name
  2.   @name
  3. end
  4. def name=(val)
  5.   @name = val
  6. end
复制代码
这里是(name)或者是(val)还是什么其它的都无所谓
也就是说attr_accessor :name一句等价上面一段
回复 支持 反对

使用道具 举报

6

主题

24

帖子

251

积分

③业余

积分
251
QQ
 楼主| 发表于 2008-8-19 11:10:50 | 显示全部楼层
感谢灼眼的夏天的回答!
第一个问题已经明白了,第二个问题可能是我问的不太清楚。
我知道attr_accessor等价上面那一段,就是不知道它的具体含义..........
很显然
def name
  @name
end
它定义了name这个函数的值就是变量@name的值
第二段
def name=(name)
@name = name
end
就不太明白了。它先定义了一个名为name=的函数后边括号中的应该是叫做“附加属性”
这个附加属性是干什么用的,底下关于函数的定义写的是@name这个变量(也就是上面name的返回值)的值等于name。
分析一下:现在有三个name了!!!
第一个:第一句话定义的函数名为name。
第二个:附加值即括号中的name。
第三个:变量@name的值等于name。
请问这三个值到底有什么关系?谁能详细的解释一下?我都晕了
回复 支持 反对

使用道具 举报

2

主题

94

帖子

1万

积分

⑧专业

S星王

积分
19631
发表于 2008-8-19 11:39:46 | 显示全部楼层
@name是实变量
name是形参是局部变量
虽然看上去是一个东西,实际是两个不同的变量

让我们先看看最原始的写法
  1. class Actor
  2.   def initialize
  3.     @name = "阿尔西斯" # @name在类中所有方法内都有效
  4.   end
  5.   def get_name
  6.     return @name
  7.   end
  8.   def set_name(name)  # 这里括号里的name跟def name=(name)括号里的name是一样的
  9.     @name = name
  10.   end  # name的作用范围到此为止
  11.   def print_name
  12.     p @name
  13.   end
  14. end
  15. a = Actor.new
  16. p a.get_name
  17. a.print_name
  18. a.set_name("克萝莉亚")
  19. p a.get_name
  20. a.print_name
复制代码

一个更简单的写法
  1. class Actor
  2.   def initialize
  3.     @name = "阿尔西斯"
  4.   end
  5.   def name
  6.     @name
  7.   end
  8.   def name=(name)
  9.     @name = name
  10.   end # name的作用范围到此为止
  11.   def print_name
  12.     p @name
  13.   end
  14. end
  15. a = Actor.new
  16. p a.name
  17. a.print_name
  18. a.name = "克萝莉亚"
  19. p a.name
  20. a.print_name
复制代码
再看看使用attr_的版本
  1. class Actor
  2.   attr_accessor :name
  3.   def initialize
  4.     @name = "阿尔西斯"
  5.   end
  6.   def print_name
  7.     p @name
  8.   end
  9. end
  10. a = Actor2.new
  11. p a.name
  12. a.print_name
  13. a.name = "克罗莉亚"
  14. p a.name
  15. a.print_name
复制代码
一个attr_accessor代替了def name 和 def name=(name)两个方法
使得代码更简洁

同样的
attr_reader 等价于
  1. def name
  2.     @name
  3. end
复制代码
attr_writer 等价于
  1. def name=(name)
  2.     @name = name
  3. end
复制代码
attr_accessor是上面的合集
回复 支持 反对

使用道具 举报

6

主题

24

帖子

251

积分

③业余

积分
251
QQ
 楼主| 发表于 2008-8-19 15:05:30 | 显示全部楼层
十分感谢,你解决了我一个长年晕菜的问题
但还有一个小问题
attr_accessor不是可以修改吗?类似于这个句子的功能:
a.set_name("克萝莉亚")
用attr_accessor后就没有set_name这个方法名了,我要拿什么句子修改呢?
不知我说清楚了没有............
回复 支持 反对

使用道具 举报

2

主题

94

帖子

1万

积分

⑧专业

S星王

积分
19631
发表于 2008-8-19 15:33:00 | 显示全部楼层
我们后两种方法不是用
a.name = "克罗莉亚"
代替了
a.set_name("克萝莉亚")
回复 支持 反对

使用道具 举报

6

主题

24

帖子

251

积分

③业余

积分
251
QQ
 楼主| 发表于 2008-8-20 15:16:32 | 显示全部楼层
再次感谢!!!这次纯感谢!!!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|幻想森林

GMT+8, 2024-5-22 12:20 , Processed in 0.026345 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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