C++ 通过C API实例化Lua对象

C++ 通过C API实例化Lua对象,c++,lua,C++,Lua,我试图通过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()

我试图通过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()
lua_getfield(L, -1, "Foo");
if (lua_pcall(L, 0, 0, 0) != 0)
{
  logger()->error("-- %1", lua_tostring(L, -1));
}
如果我从命令行运行它,它工作正常,我会看到以下输出:

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
}
我得到以下错误:尝试索引本地“self”(一个nil值)

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


谢谢大家!

定义
函数解析器:Foo()。。。结束
相当于:

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

也就是说--
Foo
是一个接受一个参数的函数。当您调用
luapcall(L,0,0,0)
时,您正在传递
0
参数。将其更改为lua_pcall(L,1,0,0),一切都会正常工作。(您还必须将pcall更改为
create
,以正确传递
2
参数,而不是
1
)。

也就是说,
a:method(…)
始终等同于
a.method(self)
更准确地说,
a:method(params)
始终等同于
a.method(a,params)
(除了
a
只计算一次外,
函数a:method(params)body end
始终等效于
a.method=函数(self,params)body end
。噢,该死,我忘记了那些函数中的
函数了。事实上。看起来我甚至不能再编辑第一条注释了。我理解为什么调用
Foo
需要我传递
self
,但是
创建
在这个例子中真的需要它吗?当我调用它时,它会返回给我一个
self
@Addy:to进一步解释,
self
没有什么特别之处,只是它是冒号语法引入的隐式参数的名称。您对
create
的定义只是声明了一个名为
self
的新变量,该变量隐藏了
self
函数参数。