赞 | 1 |
VIP | 20 |
好人卡 | 8 |
积分 | 3 |
经验 | 6181 |
最后登录 | 2022-8-5 |
在线时间 | 271 小时 |
Lv2.观梦者 神隐的主犯
- 梦石
- 0
- 星屑
- 299
- 在线时间
- 271 小时
- 注册时间
- 2008-2-22
- 帖子
- 7691
|
说的具体点那吧。
RGSS 里的类内部的变量,除了 全局变量(以 $ 开头) 外, 类里的变量都是对外不可见的,
就是说在没有这顶写入或者读取方法的时候, 类变量不能在类以外使用,比如:
- class A
- def initialize(number)
- @numner = numner;
- end
- end
- a = A.new(3);
- p a.number #=> nil number对外不可读取
- a.number = 4 #=> 错误, @number 在类定义的外部不可改变。
复制代码
这样做的原因是为了保护类的数据,达到 面向对象 的一个指标, 封装
在有的时候必须要在外部使用类里的类变量,这里就要使用 接口方法。
类里的方法是可以访问到类变量的,所以就需要定义一个方法,让方法来改变变量的值,
而不是让我们直接修改,可以把上面的脚本稍作修改:
- class A
- def initialize(number)
- @numner = numner;
- end
- def read_number
- return @number;
- end
- def write_number(new_number)
- @number = new_number;
- end
- end
- a = A.new(3);
- p a.read_number #=> 现在可以读取 number 的值了
- a.write_number(4) #=> 通过方法来 间接 的修改类变量的值。
复制代码
这样的话,某个类变量的值就可以对外可见了。 汝也可以只定义 read_number 或者是
write_number(new_number),已达到限制类外部访问变量的权利。
说的给明白点,其实修改类变量的不是我们,而是类里的方法。
当然,如果都使用以上的定义的话,方法名称想起来感觉很麻烦,所以,就换一个写法:
- class A
- def initialize(number)
- @numner = numner;
- end
- def number
- return @number;
- end
- def number=(new_number)
- @number = new_number;
- end
- end
- a = A.new(3);
- p a.number #=> 现在可以读取 number 的值了
- a.number=(4) #=> 通过方法来 间接 的修改类变量的值,或者是 a.number = 4
复制代码
这样方法的意思与作用就清晰了。
注意这句 a.number ,这里的 number 不是类变量,而是方法的名字,方法返回
的不是 @number 而是 @number 的值。
a.number=(4) 和 a.number = 4 写法不一样,但是意思与效果都是一样的。
RGSS 里为我们定义了一个操作,使得写法更清晰,所以,在修改一下脚本:
- class A
- attr_accessor :numner
- def initialize(number)
- @numner = numner;
- end
- end
- a = A.new(3);
- p a.number #=> 现在可以读取 number 的值了
- a.number = 4 #=> 通过方法来 间接 的修改类变量的值。
复制代码
是不是清晰很多,代码也少了好多。
总结一下,
attr_accessor :numner 相当于是:
def number
return @number;
end
def number=(new_number)
@number = new_number;
end
而 attr_reader :number 相当于是:
def number
return @number;
end
attr_writer :number 相当于是:
def number=(new_number)
@number = new_number;
end 版主对此帖的认可:『超赞超详细 {/qiang}』,积分『+100』。 |
|