schwarzの雑記 このページをアンテナに追加 RSSフィード

06/02/22 (Wed)2月22日の雑記

[] 23:29 2月22日の雑記 - schwarzの雑記 を含むブックマーク

CGIから遠ざかってますが気にしない。


プリセットを改造する際には欠かせないaliasですが、F12を押してゲームを再起動すると、

stack level too deep

というエラーが発生することがあります。

たとえば次のような例を見てみます。

class Bitmap

  alias original_draw_text draw_text

  def draw_text(*args)
    print "新しいdraw_textが呼ばれたよ!"
    original_draw_text(*args)
  end

end

Bitmap#draw_textのまったく無駄な再定義をしています。

これを定義したとき、F12を使うとエラーが起こるでしょう。



「F12の再起動の仕組みはどうなっているか」がポイントで、私も良くわかっていないのですが、グローバル変数やクラスの定義などが一度まっさらになって再び定義しなおされる、ということではないようです。グローバル変数の値は再起動後も残ります。


つまり、再起動後もaliasの効力が残っているわけで、2重にaliasすることになるからエラーになるのではないか、と、にらんでいます。現に、2回目以降の起動時にaliasしないような機構を作ってやると、このエラーは解消します。



さて、その機構ですが、自分でグローバル変数を作って判断しても良いのですが、たとえば$@という組み込み変数は、初回の起動時はnilですが、F12で再起動すると、

["Section016:154:in `update'", "Section016:154:in `main'",
"Section028:10"]

というようなものが入ります。これが何なのか、非常に気になるところですがそれはさておいて、これを使うと次のように書けます。

class Bitmap

  unless $@
    alias original_draw_text draw_text
  end

  def draw_text(*args)
    print "新しいdraw_textが呼ばれたよ!"
    original_draw_text(*args)
  end

end

これでエラーは出なくなります。ちゃんと機能もします。

method_defined??というものを利用しても良いのですが、$@のほうが毎回引数のメソッド名を書き換えるという手間が省けるので楽かと思います。わかりにくいというのはありますが。

[]本日のキーワード 23:30 本日のキーワード - schwarzの雑記 を含むブックマーク はてなブックマーク - 本日のキーワード - schwarzの雑記

alias

$@

[] 23:29 2月22日の雑記 - schwarzの雑記 を含むブックマーク

das Menü (メニュー)
定食、メニュー
der Regen (ーゲン)
die Wolke (ォルケ)