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

Project1

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

[讨论] F1教程中实例变量的例子难以理解的问题

[复制链接]

Lv1.梦旅人

梦石
0
星屑
70
在线时间
38 小时
注册时间
2016-9-14
帖子
33
跳转到指定楼层
1
发表于 2016-10-3 20:26:19 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

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

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

x
RUBY 代码复制
  1. class Person
  2. def name
  3.     return @name
  4. end  
  5. def name=(name)
  6.     @name = name  
  7. end  
  8. def hello
  9.     print "我是" + @name
  10. end
  11. end
  12. alex = Person.new
  13. alex.name = "阿莱库斯"
  14. alex.hello                  # => 我是阿莱库斯

这是F1教程中实例变量的例子,课本里给出的这个例子的说明是:
上面的示例是先准备 @name 实例变量,使用 name、name= 方法使对象的实例变量在对象外也可以访问。另外,末尾带有 = 记号的方法,可以用 foo.name = bar 的形式调用。 实例变量和全局变量一样,获取未赋值的实例变量时不会产生错误而会返回 nil。

这个例子的大部分意思我能理解,先定义一个Person类,定义Person方法name,其内容是输出返回值@name,之后的name=方法我就看不懂了,就我个人感觉是毫无用处……其它都没问题。
教程图片

Lv5.捕梦者

梦石
0
星屑
30940
在线时间
608 小时
注册时间
2014-7-18
帖子
729

开拓者

2
发表于 2016-10-3 22:31:56 | 只看该作者
实例变量时只能在对象内部使用的变量,但是现在我们想在类的外部使用它,就要通过accessor方法来获得,即用
def name=(name)
    @name = name  
end  
来让@name能在person这个类以外也可以使用。
可以看看360百科:http://baike.so.com/doc/2088801-2209690.html#2088801-2209690-3
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
70
在线时间
38 小时
注册时间
2016-9-14
帖子
33
3
 楼主| 发表于 2016-10-3 23:03:47 | 只看该作者
xjzsq 发表于 2016-10-3 22:31
实例变量时只能在对象内部使用的变量,但是现在我们想在类的外部使用它,就要通过accessor方法来获得,即用 ...

也就是说,它只是一个Ruby下的一种语法?
就像p,print,msgbox那样的固定东西,不必理解只需记住么?
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21666
在线时间
9418 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

4
发表于 2016-10-4 01:31:50 | 只看该作者
Elevenorth 发表于 2016-10-3 23:03
也就是说,它只是一个Ruby下的一种语法?
就像p,print,msgbox那样的固定东西,不必理解只需记住么? ...


不……你必须理解……因为这个是非常核心同时又是非常基础的知识……
这个方法你能看得懂吗?
  1. def a(b)
  2.   p b
  3. end
复制代码

name= 只是一个含有等号的方法名而已
至于它的功能则是提供一个给外部访问的接口,如果你这个Person 的名字完全不会变得话,确实毫无用处,否则的话,这个方法就是为了第13行的 alex.name = "阿莱库斯" 这句代码来使用的,你可以试着把 def name= 这个方法删掉之后再运行一下看看

回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
70
在线时间
38 小时
注册时间
2016-9-14
帖子
33
5
 楼主| 发表于 2016-10-4 14:23:02 | 只看该作者
喵呜喵5 发表于 2016-10-4 01:31
不……你必须理解……因为这个是非常核心同时又是非常基础的知识……
这个方法你能看得懂吗?

定义一个名称为a的普通函数,为其赋值b。
函数内容是在控制台内输出这个b。
结束函数定义。
大概是这样吧……教程内有解释,所以我知道name=是一个方法名,但我无法理解它怎样让@name成为可在Person类外使用的实例变量……
回复 支持 反对

使用道具 举报

Lv5.捕梦者 (暗夜天使)

只有笨蛋才会看到

梦石
1
星屑
21666
在线时间
9418 小时
注册时间
2012-6-19
帖子
7118

开拓者短篇九导演组冠军

6
发表于 2016-10-4 15:53:21 | 只看该作者
Elevenorth 发表于 2016-10-4 14:23
定义一个名称为a的普通函数,为其赋值b。
函数内容是在控制台内输出这个b。
结束函数定义。

第13行的代码这么写你看懂了吗?
  1. alex.name=("阿莱库斯")
复制代码

实际上,就是方法调用的时候省略了括号,同时等号左右两边加了一个(不会产生歧义的)空格而已

并不是特殊的用法,实际上,只要不会产生歧义,所有的方法调用都可以省略括号
  1. def a(b)
  2.   p b
  3. end
  4. a 123
  5. a 456
复制代码

点评

……我的问题是之前回复的最后一句话的说⊙﹏⊙!  发表于 2016-10-4 21:54
回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-11-23 16:02

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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