Project1

标题: 關於stack level too deep的「alias」問題,自問自答求驗證 [打印本页]

作者: 冷徹心扉    时间: 2012-12-3 01:26
标题: 關於stack level too deep的「alias」問題,自問自答求驗證
本帖最后由 冷徹心扉 于 2012-12-4 14:22 编辑

錯誤訊息為:
SystemStackError .
stack level too deep

這是人物升級素質顯示視窗,錯誤發生在F12重啟後
在魔劍工鋪找到了解決方式,原文連結
--------------------------------------------------------------------------------------------------------------------------------------
stack level too deep
可能是無限循環呼叫同個方法時發生
通常發生這個情況比較多都是用保留字「alias」重定義內部的方法名稱後
按下F12鍵重新開始時觸發的情況較多,由於F12重新只重置腳本編輯器定義的內容
內部已經被修改的定義不會重置(全局變量也不重置),導致執行「alias」2次而發生!!
要避免這種事情的發生,可以善用全局變量也不重置的特性,用條件分歧判斷是否執行
(這也是為什麼有些腳本有F12除錯標誌的原因)
class Sword
  def a
   a
  end
end
Sword.new.aclass Array # 數組類(內部)
  alias sword_clear clear
  def clear
    sword_clear # 按下F12執行這個方法後會出錯
  end
end
解決方法
class Array
  alias sword_clear clear if $ass == nil # 如果$ass是nil(默認值)就執行
  def clear
    sword_clear
  end
end
$ass = true # 將$ass改為true,防止F12重新時又再次被「alias」重定義
--------------------------------------------------------------------------------------------------------------------------------



原腳本出錯部分
  1.   alias :eds_old_dispose :dispose
  2.   def dispose   
  3.     eds_old_dispose #<------------------------------------此行報錯
  4.     @title_window.dispose
  5.     @title_sprite.dispose
  6.   end
  7. end
复制代码
我改成這樣後,暫時是測試正常了,但還是有點疙瘩在
請問這樣算不算解決無限循環問題了呢?
  1. alias :eds_old_dispose :dispose if $ass == nil    #自行追加部分
  2.   def dispose   
  3.     eds_old_dispose
  4.     @title_window.dispose
  5.     @title_sprite.dispose
  6.   end
  7. end
  8. $ass = true  #自行追加部分
复制代码

作者: 晴兰    时间: 2012-12-3 07:35
提示: 作者被禁止或删除 内容自动屏蔽




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1