スポンサーサイト

 --------
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
カテゴリ :スポンサー広告 トラックバック(-) コメント(-)

id メソッドを殲滅せよ!

 2010-11-05
アクターやアイテムなどのIDを使用した処理で、
おかしな挙動になったことはありませんか?

例えば、ID4のアクターが2人いたり、
ID4のアイテムが勝手に!?ってなことに。

ID4の。。。

犯人はコイツ「nil」です。

アクターやアイテムのID0には、何が入っていると思いますか?
$game_actors[0], $data_items[0] など、これらは nil です。
0 でなくても、範囲外の指定をすると nil が返ってきます。

例えば、こんな処理を作ってしまうとバグの原因に。
for item in $data_items
item.id
end
これだと、item に nil が入ることになります。
そして、nil.id が実行されてしまうと。。。
nil.id # => 4
つまり、ID4が2度処理されることになります。
間違った処理が実行されているのに、エラーが出ないのです。
恐ろしい。。。
こんな悪い子は、ガチャ○ンに食べれられてしまえばいいんです。

実際、id メソッドは過去の遺物とされ、
代わりに object_id を使用することが推奨されています。
そして、バージョン 1.9 では削除されました。
つまり、食べられtじゃなかった。削除しても問題ないということです。

さて、駆除方法はこちら。
class Object
undef id rescue nil
end
たった、3行のコードですべての id を駆逐することできます。
すべてと言っても、アクターやアイテムなどのIDまでは消えませんよ。
もう、ID4の恐怖とは、おさらばです。
ワ――ヾ(o・ ω・)ノ――イ

試しに nil.id を確認してみます?
きっと、エラーが出ると思いますよ。
これで、バグの発見・対処が楽になりますね。


[追記]
id メソッドを消すと、スキル画面で何もないところで
決定するとエラーが出るみたいです。

Game_Actor#skill_can_use? でオブジェクトの判別がされていないのが原因です。
Game_Battler#skill_can_use? をオーバーライドしているのですが、
super を後から呼び出しているので、オブジェクトの判別がされないまま
Game_Actor#skill_learn? が呼び出されてしまいます。
class Game_Actor
def skill_learn?(skill)
return false unless skill.is_a?(RPG::Skill)
return @skills.include?(skill.id)
end
end
このスクリプトも一緒に導入すると、問題を回避できます。
コメント




 

 ※ コメント内にURLを含めるには、バッククォート(`)をURLの直前に付け加えてください。


管理人のみ閲覧許可 [?]

おぉ!そうか、それだとスキルのところでもエラーでなくなりますね。
skill_learn? が再定義されても、エラーになることはないですしね。
教えてくれてありがとう。

しかし、obj.id は数値を返すことを期待しているので、
そこに nil を返すと、また違う問題が出てくると思います。
例えば、obj.id.to_s や hash[obj.id] など、間違っていてもエラーになりません。
結果的にエラーが出ることが多いですが、
その箇所が原因と違う部分ですので特定し辛くなるのではないでしょうか?

id メソッドが無ければ、問題の箇所でエラーが出るので、
その分修正も楽かと思い、削除という方法にしてます。


そういうことなんですが、どちらでも好きな方で良いと思いますよ。
【2010/12/21 21:09】 | CACAO | [編集]
nilがNilClassの唯一のオブジェクトであることを利用して
class >> nil
def id
nil
end
end
じゃだめ?
【2010/12/20 15:02】 | 匿名希望 | [編集]
おぉ!ありがとうございます。
報告ありがとうございます。

普通なら渡されるオブジェクトがスキルなのか
判別しないといけないのにココではされていませんね。

アイテムなんかは、どこのメソッドでも
RPG::Item クラスのオブジェクトかを判別してるのにね。

一応、全体を確認してみましたが他にはなさそうです。
【2010/11/12 00:00】 | CACAO | [編集]
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
【2010/11/10 00:30】 | | [編集]
ダジャレですかー
最近は、めっきり寒くなりましたね。
【2010/11/09 22:00】 | CACAO | [編集]
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
【2010/11/05 23:42】 | | [編集]
トラックバック
トラックバックURL:
http://cacaosoft.blog42.fc2.com/tb.php/474-6a4aecc2
≪ トップページへこのページの先頭へ  ≫
カレンダー
03 << 2017/04 >> 05
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 - - - - - -

カテゴリー
最近の記事
02/28 お返事
02/14 お返事
01/21 お返事
01/12 更新情報
11/28 お返事

最近のコメント
03/16 お返事
01/21 お返事
11/30 z座標
11/20 z座標
08/03 お返事

タグクラウド

リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。