在从我的Lua脚本调用的C函数中,我使用luaL_ref来存储对函数的引用。但是,如果我随后尝试使用返回的整数索引从不同的线程获取该函数,而该线程不是从相同的状态派生的,那么我得到的只是nil。下面是一个最简单的例子,似乎可以证明这一点:
// Assumes a valid lua_State pL, with a function on top of the stack
int nFunctionRef = luaL_ref(pL, LUA_REGISTRYINDEX);
// Create a new state
lua_State* pL2 = luaL_newstate();
lu
我试图通过使用C将函数值存储在弱表中来创建函数值的GC终结器。
首先,我用纯Lua5.2编写了一个原型:
local function myfinalizer()
print 'Called finalizer'
end
function myfunc()
print 'Called myfunc'
end
local sentinels = setmetatable({}, { __mode='k' })
sentinels[myfunc] = setmetatable({}, { __gc=myfinalizer })
my
我试图使用Lua中的表,并希望将我的代码从C#复制到它。在这里,我使用了一个嵌套字典来完成任务,但我无法在Lua实现同样的目标。
这是我试图复制的C#代码
public class FBDetails
{
public double ElapsedTime { get; set; }
public double AFB{ get; set; }
}
public void AddFBDetails(Dictionary<double, Dictionary<DateTime, List<FBDetails>>> Dict, do
我在全局Hooks表中定义了一些Lua函数如下:
print("Loading Hook System")
local pairs = pairs;
Hooks = {}
Hooks.Hooks = {}
----------
-- This file defines all the available hooks
----------
Hooks.Hooks.OnScoreboardOpen = {}
function Hooks.Add( Name, Identifier, Function )
if (Hooks.Hooks[Name] == nil) th
我在Lua中尝试了以下代码。前四种情况很好,但最后两种情况都失败了。我在这两件事上的结果是零。有什么问题吗?
v = {nil, 10, nil}
a, b, c = unpack(v)
-- Output: a, b, c = nil 10 nil
print('a, b, c = ', a, b, c)
v = {nil, nil, 10}
a, b, c = unpack(v)
-- Output: a, b, c = nil nil 10
print('a, b, c = ', a, b, c)
v = {}
v[2] = 10
a, b, c
在我的C中,我创建了一个全局元表:
luaL_newmetatable(L, "WebSocketClient");
lua_pushliteral(L, "close");
lua_pushcfunction(L, lws_sock_close);
lua_rawset(L, -3);
lua_pop(L, 1);
但在我的Lua中,我不能向其添加函数:
function WebSocketClient:read_frame()
--foo
end
我得到了这个错误:
attempt to index local 'WebSocketClient
我尝试将表写入ini文件,所有操作都正常,直到我添加了一行lua_tostring(L,-2),然后lua_next(L,-2)开始发出错误。在我的理解中,这一行是如何影响的,我只是从堆栈中获取值,而不是更多。我怎么才能修好它?
{
// Push an initial nil to init lua_next
lua_pushnil(inOutState);
// Parse the table at index
while (lua_next(inOutState, -2))
{
if (lua_isstring(inOutState
尝试使用表作为从外部传递的用户生成数据的查找。 tab = { ['on'] = function(x) x=x+1 return x end,
['off'] = function(x) x=x+2 return x end,
['high']= function(x) x=x+3 return x end,
['low'] = function(x) x=x+4 return x end
}
do
local var=0
local userDat
所以我有一组我想随机选择的人...
local strong = {
'Laura',
'David',
'Christopher'
}
我该如何从这个表中随机选择呢?到目前为止我已经跑过了
print(math.random(#strong))
但当我运行该命令时,会得到以下错误
lua: again.lua:19: attempt to get length of global 'strong' (a nil value)
为什么该数组会为零,即使该数组中有某些东西?
Lua中有没有类似于的功能,可以自动处理不存在的关联数组键的默认值?
我希望下面的代码将nil设置为v,而不是error。所以基本上,默认情况下a[2] (不存在的键)是table的一种方式:
a = {}
v = a[2][3]
>>> PANIC: unprotected error in call to Lua API (main.lua:603: attempt to index field '?' (a nil value))
在Python中,可以这样做:
>>> import collections
>>>
我正在尝试学习Lua的诀窍,我正在浏览在线教程。我试图解决的一个问题是检查一个表local foo = {},看看它有多少个元素。本教程给出了使用local length = table.getn(foo)的建议。当我使用Lua52尝试这样做时,我得到一个错误,声明为attempt to call field 'getn' (a nil value)。我进一步查看了一下,注意到table提供的任何函数都会产生相同类型的错误。是否从Lua中删除了table库?它是一个第三方库,还是什么提供的?
我一直在为一个游戏编写一个mod,但当输入键时,我遇到了一个表不返回值的问题:
for k, v in pairs(self.math) do
print(self.exce[1])
print(self.exce[k])
print(k)
if self.exce[k] ~= nil then
self.math[k] = nil
end
end
这是脚本中正在崩溃的特定部分。当我在游戏中运行这些时,它会返回:
[lua]: true
[lua]: nil
[lua]: 1
意思是说1不等于1。我用来存储数据的函数是
function
我正在尝试从一个相当大的表(bigTable)接收数据,而getRow函数应该重新排列一些数据,以便更快地计算(下面的具体信息)。问题是其中一些值不存在(->是nil)。我想我已经解决了这个问题,我添加了if-Statement来检查这个值是否存在,但是我仍然会看到下面的错误。谢谢你的帮助。
我的职能(来自第46行):
function getRow(a, b)
row = {}
for d = 0, 3 do
if (bigTable[a + d][b + d]) then
table.insert(row, bigTable[a
我知道,只要代码中仍然有对表的引用,Lua就会在内存中保留一个表,这意味着不能通过将表作为参数传递给函数来将表设置为零。但是,我不明白为什么您可以对子表这样做。
local a = {}
a.b = {}
local function remove( t )
t.b = nil
t = nil
end
remove( a )
print( a and a.b, a )
在将作为参数传递给函数remove之后,我将参数及其子表设置为零。我知道,由于上述原因,这不应该将a设置为0,但有人能告诉我为什么a.b可以设置为0,尽管据我理解,它仍然应该从外部引用它,就像a一样。
我是从书本上学习Lua的,我不是一个程序员。我正在尝试使用以下函数(直接从书中复制)将数据表保存到文件中,但该函数在尝试从_GresTable获取字符串时出现错误。为什么?
function readFromFile(filename,resTable)
local hfile = io.open(filename)
if hfile == nil then return end
local results = {} -why is this table here?
local a = 1
for line in hfile:lines() do-- d
我使用Lua脚本来读取redis商店中hashkey的内容。我的代码如下:
local key = KEYS[1]
-- Check if the user account exists
local accnt = redis.call('hgetall', key);
if next(accnt) == nil then return 404 end
return accnt;
当我运行这个程序时,我得到正确的结果如下所示。
[2016-04-17 19:27:07.807] [DEBUG] AuthServer - Loading script ./scripts/de
一些背景知识:我在不同的Lua表中跟踪不同的硬件资源--对于每个硬件资源,我都有一个相应的Lua表。为了管理所有的资源,我认为创建一个主表是有意义的,如果硬件资源是空闲的,只需将对应的摘要表To设置为零即可。
下面的示例显示,一个表似乎链接了它内部的另一个表作为引用;然而,如果我将nil赋给表键,只有键被设置为nil,而不是我实际希望的表本身。(请参阅最后5行的输出。)
local mainTable = {}
local subTable = {x = 123}
mainTable.subkey = subTable
print("The same value.")
pri
我一直在从http://www.lua.org/pil/3.6.html学习Lua中的表构造器,我不能理解这两段代码之间的区别。 --between code I've written--
list = nil
for line in io.lines() do
list = {value=line}
end
l = list
while l do
print(l.value)
end
--and between code they have written--
list = nil
for line in io.lines() do
list = {next=list,
我已经将Lua嵌入到我的C应用程序中,并试图通过以下方法了解为什么在C代码中创建了一个表:
lua_createtable(L, 0, numObjects);
返回Lua后,当我调用以下命令时,会产生一个零的结果:
print("Num entries", table.getn(data))
(其中“数据”是lua_createtable在上面创建的表)
表中显然有数据,因为我可以通过以下方式遍历每个条目(string : userdata)对:
for key, val in pairs(data) do
...
end
但是为什么table.getn(数据)返回零呢?
每个人都知道保持堆栈平衡是一个很好的编程实践。但是,我想知道的是,是否允许我修改从Lua脚本调用的C函数中的堆栈值?考虑以下代码:
int myfunc(lua_State *L)
{
int arg1 = luaL_checkinteger(L, 1);
int arg2 = luaL_checkinteger(L, 2);
// pop arg 2
lua_pop(L, 1);
// this is to be our return value
lua_newtable(L);
...do complicated stuff..
我正在尝试迭代lua表,但是我一直收到以下错误:
invalid key to 'next'
我知道索引从-8开始,我知道那里有一个表,因为它得到了其中的第一个(也是唯一的)值。然而,即使我知道表中只有一个字符串,它还是试图再次循环。
if (lua_istable(L, index))
{
lua_pushnil(L);
// This is needed for it to even get the first value
index--;
while (lua_next(L, index) != 0)
{
con
我正在尝试写一个lua开关,根据我目前所读到的,这似乎是通过使用一个表来实现的。所以我做了一个非常简单的表,但是当我尝试运行它的时候,我得到一个错误,说table index is null。
最终我想要的是基于不同的输入,这段代码应该调用不同的lua文件。但就目前而言,由于我是这门语言的新手,我想我应该满足于没有那个索引错误。
谢谢
#!/usr/bin/lua
-- hello world lua program
print ("Hello World!")
io.write('Hello, where would you like to go?\n'
我是lua的新手,对编程也很陌生。我正在努力实现以下目标。 我有一个数字表格,我可以从中随机选择一个数字。 myTable = {}
for i = 1 to 100 do
table.insert(myTable, i)
end
local numberChosen = myTable[math.random(#myTable)] 到现在为止还好。下一次选择一个数字时,我希望将该数字从表中删除。我知道lua不会删除值,它们会保留为nil。所以 table.remove(myTable, numberChosen) 当我再次尝试运行random函数时不起作用,如果值为nil,我得
从Pandoc2.0版本开始,就有了编写的能力。但是,在Pandoc2.0中,我发现在元素表上使用Lua的pairs并不能显示表中的所有键。
下面是一个很小的例子来说明这一点。在filter.lua中,我有:
function Para(elem)
io.stderr:write("A: " .. type(elem) .. "\n")
for k, v in pairs(elem) do
io.stderr:write("B: " .. k .. "\n")
end
io.stderr:write(
我( lua newbie/3天)试图调用存储在lua表中的函数,如下所示
function sayhello()
return "hello";
end
function saygoodbye()
return "goodbye";
end
funct = {
["1"] = sayhello,
["2"] = saygoodbye,
["name"] = "funct"
};
function say(ft,index)
local name = ft.name;
我有以下三项职能:
function getName() -- returns filename without ext
local files = scandir(currentDir())
local name = nil
for i = 1, #files do
if isValidExt( getExt(files[i]) ) then
name = getFilename(files[i])
break
end
end
return name
end
fu
如何从lua中的异常获取数据作为表?
x * 2
-- stdin:1: attempt to perform arithmetic on a nil value (global 'x')
-- stack traceback:
-- stdin:1: in main chunk
-- [C]: in ?
如何从异常中获取信息?这里的例子
print(getErrorInfo()['message'])
print(getErrorInfo()['line'])
-- attempt to perform ar
我有一个稀疏的lua表,我需要对它进行迭代。问题是,lua似乎从1开始迭代,并在找到空值时立即终止。下面是一个示例:
> tab={}
> tab[2]='b'
> tab[5]='e'
> for i,v in ipairs(tab) do print(i,v) end
> --nothing is output here
> tab[1]='a'
> for i,v in ipairs(tab) do print(i,v) end
1 a
2 b
>
如果我有一个暴露在Lua上的C函数,我将一个userdata对象作为参数传递给lua,那么C函数可以在lua端将这个变量设置为'nil‘吗?
// From C++
static void Delete(lua_State* L){
// the first param will be userdata and I want to set it so after this call in lua happens whatever was passed in will be nil
}
-- from lua
local obj = CreateUserDataObject()
下面的片段
local function foo ()
print('inside foo')
bar()
end
local function bar ()
print('inside bar')
end
foo()
结果如下所示
inside foo
lua: teste.lua:3: attempt to call global 'bar' (a nil value)
stack traceback:
teste.lua:3: in function 'foo'
t
我已经注册了一个函数,它创建了一个轻型用户数据,供C++和lua使用。当我使用简单变量、ints和字符串进行测试时,这个部分工作得很好。我可以在lua中创建lightuserdata,当它是字符串和ints时,不会出现错误。然而,当我尝试使用表时,它会变得更加复杂。
std::string aString = lua_tostring(lua,-4);
第一个参数是正确的,因为它应该是字符串。
if (lua_type(lua,-3 == LUA_TTABLE)) //is true so i know it recognizes it as a table
{
auto t = l