これは、1週間以上私を夢中にさせています。以下は、ゲームBitfighterのロボット プレイヤーからの Lua コードの 2 つのスニペットです(バインディングに LuaWrapper のバリアントを使用して C++ で記述されています)。
Lua スクリプトを初めて起動すると、どちらも期待どおりに動作します。しかし、激しいオブジェクトの作成と破棄を数分間行った後、バリアント 2 は動作を停止し、次のエラーが表示されます。
robot.lua:253: attempt to call missing or unknown method 'getEnergy' (a nil value)
私の目には、これらは同じように機能するはずです。誰が違いを説明できますか?
注: ターゲットは、C++ オブジェクトを表す (重い) ユーザーデータです。getEnergy と getHealth は正しく登録された C++ 関数です。この異なる動作を簡単に再現できます。これは luavec mod を使用した Lua 5.1 です。
バリアント 1 - 常に機能します
local mt = getmetatable(target)
local pow = mt.getEnergy(target) + mt.getHealth(target)
バリアント 2 - スクリプトが任意の時間実行された後、失敗し始める
local pow = target:getEnergy() + target:getHealth()