Project1

标题: 最近在学习脚本,被卡住了......... [打印本页]

作者: 鱼剑浆糊    时间: 2015-2-4 23:11
标题: 最近在学习脚本,被卡住了.........
求教super initialize attr_accessor :XXX 这三条到底是用来做什么的.....看了许多教程感觉太抽象了,还是看不明白......麻烦哪位能详细的说一下,比如它们的用法还有使用后显示出来的效果等等,谢谢  
作者: VIPArcher    时间: 2015-2-4 23:53
本帖最后由 VIPArcher 于 2015-2-4 23:56 编辑

super是调用父类的同名方法
  1. #例子:
  2. class A
  3.   def a
  4.     '喵呜='
  5.   end
  6. end
  7. class B < A
  8.   def initialize
  9.     @miao = 0
  10.   end
  11.   def a
  12.     p super + @miao.to_s
  13.   end
  14. end
  15. B.new.a  #=> "喵呜=0"
复制代码
initialize 是调用new方法生成实例时会自动调用的方法。
attr_accessor :xxx #在RGSS里被称为设置可读写的属性的解释
实际上它等价于

  1. #===================
  2.   attr_accessor :miao
  3.   #等价于
  4.   def miao
  5.     @miao
  6.   end
  7.   def miao=(x)
  8.     @miao = x
  9.   end
  10. #===================
复制代码

作者: 鱼剑浆糊    时间: 2015-2-5 09:41
本帖最后由 鱼剑浆糊 于 2015-2-5 09:42 编辑
VIPArcher 发表于 2015-2-4 23:53
super是调用父类的同名方法initialize 是调用new方法生成实例时会自动调用的方法。
attr_accessor :xxx #在 ...


谢谢,super还是不太明白,可否详细的解释一下???

initialize的意思是不是假如我定义了一个 initialize('hahaha')那么后面调用的时候直接调用hahaha?

attr_accessor  比如我定义了一个 attr_accessor :hahaha   当我后面给hahaha赋值的时候自动就算给@hahaha赋值了???
作者: taroxd    时间: 2015-2-5 09:53
鱼剑浆糊 发表于 2015-2-5 09:41
谢谢,super还是不太明白,可否详细的解释一下???

initialize的意思是不是假如我定义了一个 initiali ...


super: 调用超级父类方法。initialize 方法会在生成实例(new)的时候自动调用。

关于 attr_accessor ,暂时就这么理解吧。

RUBY 代码复制
  1. class C
  2.   def initialize(argument)
  3.     puts "生成了一个#{self.class}的实例,参数为#{argument}"
  4.   end
  5. end
  6.  
  7. C.new(233) # 输出:生成了一个C的实例,参数为233
  8.  
  9. class CC < C
  10.   def initialize
  11.     super(233) # 调用类 C 的同名实例方法 initialize。
  12.   end
  13. end
  14.  
  15. CC.new # 输出:生成了一个CC的实例,参数为233

作者: 鱼剑浆糊    时间: 2015-2-5 10:36
taroxd 发表于 2015-2-5 09:53
super: 调用超级父类方法。initialize 方法会在生成实例(new)的时候自动调用。

关于 attr_acce ...

{:2_276:}更看不懂了.....
作者: 芯☆淡茹水    时间: 2015-2-5 11:20
本帖最后由 芯☆淡茹水 于 2015-2-5 11:29 编辑

super 你就当它是一个简写好了,简写的是该类的上一级(父类)的同名方法内容。(首先确定该类
有没有上一级父类,以及父类里有没有同名的方法)
比如说中央法规和地方法规。先规定了中央法规,在写地方法规时,要沿用全部中央法规的内容,
就 super ,然后后面再写地方法规的内容。

initialize 就当做是一个默认方法吧,可有可无的一个方法。在生成类的实例时,有这个 initialize 方法
就自动执行它,没有当然就不执行。一些类在生成实例的时候就需要赋值啊,计算啊,,,什么的,
就可以把这些赋值,计算,,,的过程,定义一个 initialize ,再写在 initialize 方法里。有些类不需要
一些初期的处理,就可以不定义这个 initialize 方法的。

attr_accessor  定义读取和写入的方法,后面跟 : 加变量名。
比如@hahaha, 如果没定义这个 attr_accessor ,这个变量@hahaha 只能在该类的内部使用,在该
类的外部,不能读取或者改变它。定义了 attr_accessor :hahaha   ,就可以在外部读取它的值,或者
改变它的值。
作者: 鱼剑浆糊    时间: 2015-2-5 11:31
芯☆淡茹水 发表于 2015-2-5 11:20
super 你就当它是一个简写好了,简写的是该类的上一级(父类)的同名方法内容。(首先确定该类
有没有上一 ...

哦哦 谢谢 那super super()和某个变量后面+super有什么区别???
作者: 芯☆淡茹水    时间: 2015-2-5 11:48
super   执行父类同名方法。
super() 如果父类同名方法需要参数,在括号里对应的写入参数,传递给父类的同名方法,并执行。
如果括号为空,意思为 子类的方法需要参数,而父类不需要参数,那么子类就不传递参数给父类。貌似是这样。
+super 把 super 用于计算,要先确定父类的同名方法运行结果能不能用于计算,比如 nil 就会报错。
这个 +super 大概意思为:加上父类的同名方法的运算返回的值。
作者: 鱼剑浆糊    时间: 2015-2-5 12:11
芯☆淡茹水 发表于 2015-2-5 11:48
super   执行父类同名方法。
super() 如果父类同名方法需要参数,在括号里对应的写入参数,传递给父类的同 ...

谢谢 明白了




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