| 赞 | 189 |
| VIP | |
| 好人卡 | |
| 积分 | 96 |
| 经验 | |
| 最后登录 | 2026-5-4 |
| 在线时间 | 5074 小时 |
- 梦石
- 0
- 星屑
- 9557
- 在线时间
- 5074 小时
- 注册时间
- 2013-6-21
- 回帖
- 3459
  
|
发表于 2016-10-24 09:04:55
|
显示全部楼层
RGSS1不将@items等变量在Game_Party内公开是有一定道理的。它涉及到面向对象编程中内部变量的隐藏和对象的封装。如果打开一个新的RMXP工程,你会发现Game_Party中并没有attr_reader :items的声明。这并不是RMXP的问题,而是和@items有关的操作已经封装完毕,无需将它再次公开出来。
具体来说,查看物品数量,获取物品,失去物品都已经有现成的接口,所以你大可不必直接去查看@items的具体内容:
[pre lang="Ruby"]$game_party.item_number(item_id) # 获取物品数量
$game_party.gain_item(item_id, number) # 获得物品
$game_party.lose_item(item_id, number) # 失去物品
[/pre]
而不是这样
[pre lang="Ruby"]attr_reader :items
$game_party.items[item_id]
$game_party.items[item_id] += n
$game_party.items[item_id] -= n
[/pre]
正如你所说,如果1号物品的数量为0,那么此时强行访问$game_party.items[1]会得到nil或0(取决于@items变量的状态),而 nil 是不能和数字比较大小的。所以
[pre lang="Ruby"]$game_party.items[1] > 0[/pre]
仍然是一个有问题的写法。
你可以查看 Game_Party#item_number 的定义,这里面考虑到了所有的情况。既然 RMXP 给你实现了一个比较好的接口,那么为什么不去用呢?
总之,遇到这种读取问题不要总想着去加 attr_reader / attr_accessor。有时候问题看似解决但是会带来很多隐患,这会使得自己陷入无休止的脚本查错任务当中。所以还是有必要注重规范的脚本编写/修改习惯。 |
|