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