Project1
标题:
Window_Selectable里cursor_down方法里面的index是哪来的?
[打印本页]
作者:
adahs
时间:
2020-5-21 14:32
标题:
Window_Selectable里cursor_down方法里面的index是哪来的?
#--------------------------------------------------------------------------
# ● 光标向下移动
#--------------------------------------------------------------------------
def cursor_down(wrap = false)
if index < item_max - col_max || (wrap && col_max == 1)
select((index + col_max) % item_max)
end
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