1. ホーム
  2. lua

[解決済み] Lua: グローバルな 'mapfinishes' (nil 値) に対して演算を実行しようとした。

2022-02-10 17:28:01

質問

Luaで動くゲームで、プレイヤーがマップを終了したときに、この特定のローカル関数がトリガーされるように設定しようとしています。以下はそのコードです。

local function setDrRanks( ply )
    local name = SQLStr( ply:Nick() )
    local sid = ply:SteamID()

    drsql:query( "SELECT MapFinishes from dr_exp WHERE SteamID = '"..sid.."'", function( q, data )
        local row = data[1]

        if ( row ) then
            mapfinishes = row["Mapfinishes"]
        end

        drsql:query( "REPLACE into dr_exp (`SteamID`, `PlayerName`, `MapFinishes`) VALUES('"..sid.."', "..name..", '"..(mapfinishes+1).."');" );
    end )
end

この関数はlua関数を介してSQLに挿入するもので、最初に実行したときはプレイヤーが0回のフィニッシュだったため、正常に実行されました。1になると、mapfinishesの値に単純に+1することを拒否されました。不思議なのは、プレイヤーが0フィニッシュのときは100%動作するようで、1にしてくれますが、1になってしまうと、それ以上追加してくれません。受け取ったエラーは

attempt to perform arithmetic on global 'mapfinishes' (a nil value)

どなたかお分かりになる方はいらっしゃいますか?よろしくお願いします。

解決方法は?

    local row = data[1]

    if ( row ) then
        mapfinishes = row["Mapfinishes"]
    end

    drsql:query( "REPLACE into dr_exp (`SteamID`, `PlayerName`, `MapFinishes`) VALUES('"..sid.."', "..name..", '"..(mapfinishes+1).."');" )

問題は式にあります。 mapfinishes+1 を使わずに実行されてしまったようです。 mapfinishes が設定される。このことから if ループが実行されなかったのは rownil または false . Luaでは、0と空文字列は真理値であることを忘れないでください。

もう一つの可能性は row["Mapfinishes"] は、それ自体が nil そうすると mapfinishes 残る nil .

通常、グローバル変数は最小限またはゼロにするのがよいでしょう。もし、あなたが mapfinishes をこの関数の中だけで宣言するのが適切でしょう。 local .