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

Project1

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

[已经解决] 简单的练习脚本提问

[复制链接]

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2011-2-17
帖子
518
跳转到指定楼层
1
发表于 2013-7-24 10:53:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

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

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

x
  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. name(艾利克斯)
  14. alex.hello               
复制代码
这是我在练习时改的脚本 问题出在下面这一段
  def name(name)
    @name = name
  end
我的想法是设置变量(name)通过name(艾利克斯)为变量赋值 再通过    @name = name为实变量赋值 最后在print "我是" + @name + ""形成语句

但教程上说得这么写
  def name=(name)
    @name = name
  end

通过实践教程果然是正确的 我的是错的 这是为神马....

Lv2.观梦者

梦石
0
星屑
690
在线时间
791 小时
注册时间
2011-10-20
帖子
2394

开拓者

2
发表于 2013-7-24 10:57:06 | 只看该作者
这两个方法名·都一样,所以前面那个方法失效,就这么简单
def name
    return @name
  end
  def name(name)
    @name = name
  end

点评

呵呵  发表于 2013-7-24 11:25
我明白什么意思了 谢谢  发表于 2013-7-24 11:22
但是如果写def name(name)运行脚本就是错的 而改成def name=(name)脚本就可以正确运行  发表于 2013-7-24 11:18
欢迎点此进入我的egames.wink.ws,有RMQQ堂等

[url=http://rpg.blue/thread-317273-1-1.html]短篇八-赶选

http://yun.baidu.com/share/link?shareid=2158225779&uk=169642147&third=0


历险ARPG赢回你的疆域新的战斗模式?…………点击这里:[宋乱贼狂 for QQ堂]
http://rpg.blue/group-368-1.html
programing ....?
[url=http://rpg.blue/thrd-234658-1-1.html]
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2011-2-17
帖子
518
3
 楼主| 发表于 2013-7-24 11:08:39 | 只看该作者
end55rpg 发表于 2013-7-24 10:57
这两个方法名·都一样,所以前面那个方法失效,就这么简单
def name
    return @name

没明白 既然是都一样的 为什么我写的那个def name(name)就是错的 而教程上def name=(name)就是对的呢? 我

点评

木有错,你方法写的不是@name=name么,当然就没有returnname咯?  发表于 2013-7-24 11:12
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
869 小时
注册时间
2009-3-13
帖子
782
4
发表于 2013-7-24 11:17:05 | 只看该作者
本帖最后由 认真的学 于 2013-7-24 11:20 编辑
小和尚 发表于 2013-7-24 11:08
没明白 既然是都一样的 为什么我写的那个def name(name)就是错的 而教程上def name=(name)就是对的呢?  ...


因为教程上面的方法名是name=,多了个等于号
另外
  1. name(艾利克斯)
复制代码
不应该是
  1. alex.name("艾利克斯")
复制代码
么= =
这样虽然可以达到显示名称的效果,但是写入name的方法把读取name的方法覆盖了。

点评

那为什么我把name= 换成names 就发生错误呢? “=”不是只是函数名称的一部分吗  发表于 2013-7-24 11:26
我的寒假活动作品:http://rpg.blue/forum.php?mod=viewthread&tid=281065
咱的龙蛋,求点击:
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2011-2-17
帖子
518
5
 楼主| 发表于 2013-7-24 11:19:47 | 只看该作者
认真的学 发表于 2013-7-24 11:17
因为教程上面的方法名是name=,多了个等于号

哦  我试试看

点评

求错误的具体代码。  发表于 2013-7-24 11:27
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2011-2-17
帖子
518
6
 楼主| 发表于 2013-7-24 11:28:43 | 只看该作者
end55rpg 发表于 2013-7-24 10:57
这两个方法名·都一样,所以前面那个方法失效,就这么简单
def name
    return @name
  1. class Person
  2.   def name
  3.     return @name
  4.   end
  5.   def names(name)
  6.     @name = name
  7.   end
  8.   def hello
  9.     print "我是" + @name + ""
  10.   end
  11. end

  12. alex = Person.new
  13. alex.names = "艾力克斯"
  14. alex.hello               
复制代码
这是再次改过的脚本 方法名换了 但是仍有错误

点评

不要被=号迷糊了,仅仅方便人们,他就是abcd这种东西  发表于 2013-7-24 11:43
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
869 小时
注册时间
2009-3-13
帖子
782
7
发表于 2013-7-24 11:31:33 | 只看该作者
本帖最后由 认真的学 于 2013-7-24 11:35 编辑
小和尚 发表于 2013-7-24 11:28
这是再次改过的脚本 方法名换了 但是仍有错误


如果这样改的话,只能用names("艾力克斯")
像name=这样的方法名是比较特殊的,可以通过name="xxxx"调用。不过这种调用方法省略了括号,调用的实质是name=("xxxx")。
因为方法名是names不是names=,所以不能这样调用。
我的寒假活动作品:http://rpg.blue/forum.php?mod=viewthread&tid=281065
咱的龙蛋,求点击:
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
50
在线时间
182 小时
注册时间
2011-2-17
帖子
518
8
 楼主| 发表于 2013-7-24 11:34:47 | 只看该作者
认真的学 发表于 2013-7-24 11:31
如果这样改的话,只能用names("艾力克斯")
像name=这样的方法名是比较特殊的,可以通过name="xxxx"调用。 ...

谢谢了~
回复 支持 反对

使用道具 举报

Lv1.梦旅人

梦石
0
星屑
55
在线时间
869 小时
注册时间
2009-3-13
帖子
782
9
发表于 2013-7-24 11:36:32 | 只看该作者
小和尚 发表于 2013-7-24 11:34
谢谢了~

再另外说一下好了= =
如果想要对外开放实例变量的读写权利的话,可以使用attr来实现,就不用写这么多方法了。

点评

谢谢~  发表于 2013-7-24 11:37
我的寒假活动作品:http://rpg.blue/forum.php?mod=viewthread&tid=281065
咱的龙蛋,求点击:
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3588
在线时间
3065 小时
注册时间
2011-11-17
帖子
980
10
发表于 2013-7-25 01:46:47 | 只看该作者
本帖最后由 yagami 于 2013-7-25 02:21 编辑

def name
return @name
end  这函数只是返回@name的值

alex.name其实可以理解为 alex.name()  这是个不传任何参数的函数//C里面就这么写的 RUBY不参数的函数省略括号
所以alex.name千万别理解成读取alex的name变量 其实是调用alex的name函数

至于为何要这个函数 ?  attr_reader修饰的变量是私有成员  因为外界不能直接访问私有成员  如果要获取或修改name 需要个公有的接口函数
所以类似这样写alex.name="aaa"是绝对会报错的(不管你写没写name函数都报错)要修改就要用那个 names(name)函数了

但如果用attr_accessor 修饰name 那么 这个name函数完全没存在的意义 因为name变量已经变成公有变量了
外界可以直接读取或修改   所以这时写alex.name="aaa"是合法的

#################################################################
def names(name)###括号里的name是传参 所以名字其实无所谓 取名x都行
@name = name###把传参name赋给@name
#这里其实省略了一个return 其实可以理解为返回个void 也就是说并没返回值
end
该函数起到的作用仅仅是把@name赋值而已
alex.names("aaa")起到的作用只是把aaa赋给对象alex的name变量上
函数要这样调用 对象.函数名(参数)



点评

明白了! 我对函数调用的理解又近一步了 谢谢~  发表于 2013-7-25 07:40

评分

参与人数 1星屑 +100 收起 理由
︶ㄣ牛排ぶ + 100 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

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

本版积分规则

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

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

GMT+8, 2024-12-31 06:23

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

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