Project1

标题: 在方法内使用self.读取方法和使用对应实变量读取属性的区别 [打印本页]

作者: rt6543ew    时间: 2017-7-11 05:54
标题: 在方法内使用self.读取方法和使用对应实变量读取属性的区别
本帖最后由 rt6543ew 于 2017-7-11 06:12 编辑

在看技能树脚本的时候看到这样一段脚本
  1. class Tree_selectable < Window_Base
  2.   #--------------------------------------------------------------------------
  3.   # ● 定义实例变量
  4.   #--------------------------------------------------------------------------
  5.   attr_reader   :index                    # 光标位置
  6.   attr_reader   :help_window              # 帮助窗口
  7.   #--------------------------------------------------------------------------
  8.   # ● 初始画对像
  9.   #     x      : 窗口的 X 坐标
  10.   #     y      : 窗口的 Y 坐标
  11.   #     width  : 窗口的宽
  12.   #     height : 窗口的高
  13.   #--------------------------------------------------------------------------
  14.   def initialize(x, y, width, height)
  15.     super(x, y, width, height)
  16.     @item_max = 1
  17.     @column_max = 1
  18.     @index = -1
  19.   end
  20.   #--------------------------------------------------------------------------
  21.   # ● 设置光标的位置
  22.   #     index : 新的光标位置
  23.   #--------------------------------------------------------------------------
  24.   def index=(index)
  25.     @index = index
  26.     # 刷新帮助文本 (update_help 定义了继承目标)
  27.     if self.active and @help_window != nil #如果自身的active是true且
  28.       update_help
  29.     end
  30.     # 刷新光标矩形
  31.     update_cursor_rect
  32.   end
  33.   #--------------------------------------------------------------------------
  34.   # ● 帮助窗口的设置
  35.   #     help_window : 新的帮助窗口
  36.   #--------------------------------------------------------------------------
  37.   def help_window=(help_window)
  38.     @help_window = help_window
  39.     # 刷新帮助文本 (update_help 定义了继承目标)
  40.     if self.active and @help_window != nil
  41.       update_help
  42.     end
  43.   end
  44. end
复制代码

在这段脚本的27行,为何对active属性使用读取方法而对help_window属性直接读取了其对应的实变量?
作者: 张咚咚    时间: 2017-7-11 08:14
因为help_window在第六行已经声明了直接可以读取啊
作者: rt6543ew    时间: 2017-7-11 09:06
张咚咚 发表于 2017-7-11 08:14
因为help_window在第六行已经声明了直接可以读取啊

我只是想问为什么不用self.help_window或者@active
作者: antilmid    时间: 2017-7-11 09:17
rt6543ew 发表于 2017-7-11 09:06
我只是想问为什么不用self.help_window或者@active

怎么说呢,我就个人习惯来说,self我一般用来调用自身方法,对于你这个问题,我觉得看情况说事,而且编程方法很多,不限于一种。
作者: fux2    时间: 2017-7-11 09:41
rt6543ew 发表于 2017-7-11 09:06
我只是想问为什么不用self.help_window或者@active


方法和变量显然是不同的吧
  1. def active
  2. return nil
  3. end
复制代码


你觉得self.active和@active区别在哪里呢?
作者: 张咚咚    时间: 2017-7-11 10:29
本帖最后由 张咚咚 于 2017-7-11 18:07 编辑
rt6543ew 发表于 2017-7-11 09:06
我只是想问为什么不用self.help_window或者@active


这和java是一个意思,一个类里面,如果变量没有与方法函数重名,使用var和super.var没有任何区别的


RUBY 代码复制
  1. class Window_aa
  2.  
  3.   attr_accessor :var
  4.  
  5.   def initialize
  6.     @var = 1  #实例化变量
  7.   end
  8.   def mt(var)
  9.     p var #局部变量
  10.     p @var #实例变量,不好意思蒙圈了,是实例变量只有实例后才有效
  11.     p self.var #与类变量一致,但必须要本类或父类声明 attr_accessor :var 才可调用
  12.   end
  13. end
  14.  
  15. Window_aa.new.mt(555)
  16.  
  17. class Window_bb < Window_aa
  18.  
  19.   def initialize
  20.     super  #实例化变量(调用父类)
  21.   end
  22.  
  23.   def mt(var)
  24.     p var #局部变量
  25.     p @var #实例变量
  26.     p self.var #与类变量一致,但必须要本类或父类声明 attr_accessor :var 才可调用
  27.   end
  28.  
  29. end
  30.  
  31. Window_bb.new.mt(555)


这样应该就好理解了吧
作者: 铅笔描绘的思念    时间: 2017-7-11 11:42
就是self.active其实是调用一个返回@active的方法名为active的方法吧
其实为了美观强行多个方法返回变量值MV更常见 定义变量喜欢_开头然后觉得不美观强行多个方法使得美观.所以说是一个意思没区别的
作者: rt6543ew    时间: 2017-7-11 14:23
fux2 发表于 2017-7-11 09:41
方法和变量显然是不同的吧

对属性的读取方法重定义?
作者: fux2    时间: 2017-7-11 16:31
rt6543ew 发表于 2017-7-11 14:23
对属性的读取方法重定义?

算不上重定义吧。
用attr设置访问控制,实际上也就是相当于帮你定义了直接返回同名成员变量的函数。
作者: guoxiaomi    时间: 2017-7-12 13:04
直接认为ruby里没有属性这个概念,self.x 就是调用名为 :x 的方法。
attr_reader :x
就是
def x
  @x
end
attr_writer :x
就是
def x=(x)
  @x=x
end
你如果不声明属性x,调用 self.x 会报undefined method错。
  1. class A
  2.   def initialize
  3.     @x = 0
  4.   end
  5. end
  6. a = A.new
  7. a.instance_variables
  8. a.instance_variable_get(:@x)
  9. a.x # 报错
复制代码





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