Project1

标题: 简单的练习脚本提问 [打印本页]

作者: 小和尚    时间: 2013-7-24 10:53
标题: 简单的练习脚本提问
  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

通过实践教程果然是正确的 我的是错的 这是为神马....
作者: end55rpg    时间: 2013-7-24 10:57
这两个方法名·都一样,所以前面那个方法失效,就这么简单
def name
    return @name
  end
  def name(name)
    @name = name
  end
作者: 小和尚    时间: 2013-7-24 11:08
end55rpg 发表于 2013-7-24 10:57
这两个方法名·都一样,所以前面那个方法失效,就这么简单
def name
    return @name

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

作者: 认真的学    时间: 2013-7-24 11:17
本帖最后由 认真的学 于 2013-7-24 11:20 编辑
小和尚 发表于 2013-7-24 11:08
没明白 既然是都一样的 为什么我写的那个def name(name)就是错的 而教程上def name=(name)就是对的呢?  ...


因为教程上面的方法名是name=,多了个等于号
另外
  1. name(艾利克斯)
复制代码
不应该是
  1. alex.name("艾利克斯")
复制代码
么= =
这样虽然可以达到显示名称的效果,但是写入name的方法把读取name的方法覆盖了。
作者: 小和尚    时间: 2013-7-24 11:19
认真的学 发表于 2013-7-24 11:17
因为教程上面的方法名是name=,多了个等于号

哦  我试试看
作者: 小和尚    时间: 2013-7-24 11:28
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               
复制代码
这是再次改过的脚本 方法名换了 但是仍有错误
作者: 认真的学    时间: 2013-7-24 11:31
本帖最后由 认真的学 于 2013-7-24 11:35 编辑
小和尚 发表于 2013-7-24 11:28
这是再次改过的脚本 方法名换了 但是仍有错误


如果这样改的话,只能用names("艾力克斯")
像name=这样的方法名是比较特殊的,可以通过name="xxxx"调用。不过这种调用方法省略了括号,调用的实质是name=("xxxx")。
因为方法名是names不是names=,所以不能这样调用。
作者: 小和尚    时间: 2013-7-24 11:34
认真的学 发表于 2013-7-24 11:31
如果这样改的话,只能用names("艾力克斯")
像name=这样的方法名是比较特殊的,可以通过name="xxxx"调用。 ...

谢谢了~
作者: 认真的学    时间: 2013-7-24 11:36
小和尚 发表于 2013-7-24 11:34
谢谢了~

再另外说一下好了= =
如果想要对外开放实例变量的读写权利的话,可以使用attr来实现,就不用写这么多方法了。
作者: yagami    时间: 2013-7-25 01:46
本帖最后由 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变量上
函数要这样调用 对象.函数名(参数)








欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1