3

C API を介して Lua で OO 機能を実行しようとしています。私のLuaスクリプトには次のものがあります:

Parser = {}
Parser.__index = Parser

function Parser:create(url)
    local self = {}
    print ("creating")
    self.baseUrl = url
    setmetatable(self, Parser)
    return self
end

function Parser:Foo()
    print ("baseUrl: " .. self.baseUrl)
end

p = Parser:create("http://www.google.com")
p:Foo()

これをコマンド ラインから実行すると、正常に動作し、次の出力が表示されます。

creating
baseUrl: http://www.google.com

ここで、最後の 2 行をコメントアウトして、C API を介して次のことを試してみます。

// <load the state and lua file>
lua_getglobal(L, "Parser");
lua_getfield(L, -1, "create");
lua_pushstring(L, "http://www.google.com");

if (lua_pcall(L, 1, 1, 0) != 0)
{
  // handle error
}

これは機能します。期待どおり、標準出力に「作成中」と表示されます。私が理解しているように、新しいParserオブジェクトがスタックの一番上にあります。すぐに次のことを試してみてください。

lua_getfield(L, -1, "Foo");
if (lua_pcall(L, 0, 0, 0) != 0)
{
  logger()->error("-- %1", lua_tostring(L, -1));
}

次のエラーが表示されます:ローカル 'self' (nil 値) のインデックスを作成しようとしています

私が間違っていることと、関数を期待どおりに実行する方法を誰かに教えてもらえますか?

ありがとうございました!

4

1 に答える 1

2

定義function Parser:Foo() ... endは次と同等です。

Parser.Foo = function(self)
    print ("baseUrl: " .. self.baseUrl)
end

つまり --Fooは引数を 1 つ取る関数です。呼び出すと、引数lua_pcall(L, 0, 0, 0)が渡され0ます。に変更するとlua_pcall(L, 1, 0, 0)、すべてが機能するはずです。(引数を ではなくcreate正しく渡すには、pcall を に変更する必要もあります)。21

于 2012-12-19T16:08:11.500 に答える