C++ 通过C API实例化Lua对象
我试图通过C API在Lua中实现一些OO功能。在我的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()
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
函数参数。