2

いくつかのメンバー値を出力するメンバー関数を持つ単純なクラスを作成しようとしていますが、'self' を参照しようとするとエラーが発生します。

attempt to index global 'self' (a nil value)

実行しようとしているスクリプトは次のとおりです。

Test = {}

function Test:new()
    T = {}
    setmetatable(T, self)
    self.__index = self
    self.Name = "Test Object"
    return T
end

function Test:printName()
    print("My name is " .. self.Name) -- This causes the error
end

私も試しましself:Nameたが、同様のエラーが発生します。ここで何が間違っていますか?

編集:

printName()C++ コードから関数を呼び出すことを忘れていました。Lua から関数を呼び出すと、正常に動作します。

Lua で Test オブジェクトを作成し、コールバック関数を実行します。コールバックは、次のように C++ で呼び出されます。

luabridge::LuaRef testObjectRef = ...; // This is populated from Lua, refers to the printName() function
testObjectRef(); // Calls the function

スクリプト内のコールバックは次のように行われます。

-- in Test:new()
self.Callback = LuaCallback(self.printName)
Helper.setCallback(self.Callback)

を参照しない限り、コールバック自体は正常に機能しselfます。エラーは、私がそれをしようとしたときにのみ発生します。

4

2 に答える 2

1

私はあなたのコードを取り、追加しました:

local test = Test:new()
test:printName()

それは私に正しい出力を与えます。

My name is Test Object

C API 経由で呼び出している場合は、self引数を手動でスタックにプッシュすることを忘れないでください。次のことを覚えておいてください。

obj:fun() ~ obj.fun(obj)
于 2014-12-03T09:28:14.387 に答える
1

私は問題を解決することができました。を追加のself引数としてリスナー コンストラクターに追加し、それを最初のパラメーターとしてコールバック関数に渡しました。

-- in the script
self.Callback = LuaCallback(self, self.printName)
Helper.setCallback(self.Callback)
于 2014-12-03T09:50:01.570 に答える