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

现在,如果我注释掉最后两行并通过 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));
}

我收到以下错误:尝试索引本地“自我”(零值)

谁能告诉我我做错了什么以及如何让函数按预期运行?

谢谢!

4

1 回答 1

2

定义function Parser:Foo() ... end等价于:

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

那就是 --Foo是一个接受一个参数的函数。当你打电话时,lua_pcall(L, 0, 0, 0)你正在传递0参数。将其更改为lua_pcall(L, 1, 0, 0),一切都应该工作。(您还必须将 pcall 更改create为正确传递2参数,而不是1)。

于 2012-12-19T16:08:11.500 回答