Project1

标题: Window_Selectable里cursor_down方法里面的index是哪来的? [打印本页]

作者: adahs    时间: 2020-5-21 14:32
标题: Window_Selectable里cursor_down方法里面的index是哪来的?
  1.   #--------------------------------------------------------------------------
  2.   # ● 光标向下移动
  3.   #--------------------------------------------------------------------------
  4.   def cursor_down(wrap = false)
  5.     if index < item_max - col_max || (wrap && col_max == 1)
  6.       select((index + col_max) % item_max)
  7.     end
  8.   end
复制代码
想写一个非Window类的Selectable,然后对着Window_Selectable抄着抄着就报错了,然后才发现cursor_down里面还有一个莫名其妙的index,明明没有输入index,也没有定义index方法,看window里面也没有index属性,那这里的index是怎么回事?正常来说不是会报错吗?


作者: chanszeman1018    时间: 2020-5-21 14:36
提示: 作者被禁止或删除 内容自动屏蔽
作者: KB.Driver    时间: 2020-5-21 15:09
本帖最后由 KB.Driver 于 2020-5-21 15:15 编辑
chanszeman1018 发表于 2020-5-21 14:36
index不是一个方法吧?
它只是一个用来儲存光标位置的实例变量吧?


抓个虫,这里的index确实是一个方法

attr_reader是一个特殊的方法
这类可以在类中调用的方法有一个名字叫“类宏”

attr_reader的原理就是为所在上下文(类)定义一个实例方法
比如attr_reader :index,就会定义一个实例方法index,方法返回实例变量@index的值
形式类似于
def index
  @index
end

同一类型的还有attr_writer,attr_accessor
attr_writer :index相当于
def index=(x)
  @index = x
end

attr_accessor相当于同时调用attr_reader与attr_writer

至于为什么要这么写,因为ruby的实例变量默认是private的,也就是无法被外部直接访问。
attr_*相当于属性访问器,reader使外部可以读变量,writer使外部可以改写变量。
写一行attr_accessor比定义两个方法不是省事多了吗?






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