我想创建一个像这样的表
myTable = {
[0] = { ["a"] = 4, ["b"] = 2 },
[1] = { ["a"] = 13, ["b"] = 37 }
}
Run Code Online (Sandbox Code Playgroud)
使用C API?
我目前的做法是
lua_createtable(L, 0, 2);
int c = lua_gettop(L);
lua_pushstring(L, "a");
lua_pushnumber(L, 4);
lua_settable(L, c);
lua_pushstring(L, "b");
lua_pushnumber(L, 2);
lua_settable(L, c);
Run Code Online (Sandbox Code Playgroud)
在循环中创建内部表.之前,这个循环,我用
lua_createtable(L, 2, 0);
int outertable = lua_gettop(L);
Run Code Online (Sandbox Code Playgroud)
为2个数字槽创建外部表.
但是如何将内部表保存到外部表?
我x在Lua 有一个数组.我想设置head = x[1]和rest =数组的休息,让rest[1] = x[2],rest[2] = x[3]等.
我怎样才能做到这一点?
(注意:我不在乎原始数组是否会发生变异.在Javascript中我会这样做,head = x.shift()并且x会包含剩余的元素.)
我需要将表转换为逗号分隔列表,以便将其保存到文本文件中.是否有内置的方法在Lua中执行此操作?
我在lua有一张桌子
test = {1,2,4,2,3,4,2,3,4,"A", "B", "A"}
我想删除表中的所有重复元素.
输出应该是
test = {1,2,4,3,"A","B"}
我的尝试:
> items = {1,2,4,2,3,4,2,3,4,"A", "B", "A"}
> flags = {}
> for i=1,table.getn(items) do
if not flags[items[i]] then
io.write(' ' .. items[i])
flags[items[i]] = true
end
>> end
1 2 4 3 A B>
现在工作正常.感谢您的回答和评论.
当我通过redis EVAL运行此代码时,它不会返回任何结果.知道为什么这不起作用吗?
redis-cli EVAL "$(cat bug.lua)" 0
Run Code Online (Sandbox Code Playgroud)
local retv = {}
retv["test"] = 1000
return retv
Run Code Online (Sandbox Code Playgroud)
如果我初始化表,那么单独打印值.
$ cat bug.lua
--!/usr/bin/env lua
local retv = {"This", "is", "a", "bug" }
retv["test"] = 1000
return retv
$ redis-cli EVAL "$(cat bug.lua)" 2 a b
1) "This"
2) "is"
3) "a"
4) "bug"
Run Code Online (Sandbox Code Playgroud) 如何从末尾迭代一个简单的Lua表,这是一个序列?
想要的行为示例:
local mytable = {'a', 'b', 'c'}
for i, value in reversedipairs(mytable) do
print(i .. ": " .. value)
end
Run Code Online (Sandbox Code Playgroud)
应该输出
3: c
2: b
1: a
Run Code Online (Sandbox Code Playgroud)
这里怎么实现reversedipairs?
如何编写一个函数来确定它的表参数是否为真数组?
isArray({1, 2, 4, 8, 16}) -> true
isArray({1, "two", 3, 4, 5}) -> true
isArray({1, [3]="two", [2]=3, 4, 5}) -> true
isArray({1, dictionaryKey = "not an array", 3, 4, 5}) -> false
Run Code Online (Sandbox Code Playgroud)
我看不出有什么方法可以找出数字键是否是唯一的键.
我想在字符串中获得最常见的k大小的子字符串.为此,我使用表来存储每个子字符串的出现次数.这是代码:
function frequentWords(seq, k)
local subs = ""
local counter = {}
for i = 1,(seq:len()-k+1) do
subs = seq:sub(i, i+k-1)
counter[subs] = (counter[subs] and counter[subs] + 1 or 1)
--print(subs .. ": " .. counter[subs])
end
end
Run Code Online (Sandbox Code Playgroud)
该线counter[subs] = (counter[subs] and counter[subs] + 1 or 1)具有相同的平均值 counter[subs] = (counter[subs] ? counter[subs]+1 : 1).这条线只有counter[subs] = counter[subs] + 1在我们可以设置每个新counter元素时才会这样0.Lua有可能这样吗?如果不是,做类似事情的最佳方法是什么?
例如,在Ruby中,这是通过像这样声明一个Hash来完成的:
counter = Hash.new(0)
Run Code Online (Sandbox Code Playgroud) 我是lua的新手,我有一张桌子foo,我想把它转换成bar如下:
foo:{key1,value2,key2,value2} ==> bar:{key1=value1,key2=value2}
Run Code Online (Sandbox Code Playgroud)
lua有内置方法吗?
摘录自Lua 5.3手册:
_G
保存全局环境的全局变量(不是函数)(参见§2.2).Lua本身不使用这个变量; 改变其价值不会影响任何环境,反之亦然.
相关部分来自§2.2
[...]每个块都在一个名为的外部局部变量的范围内编译
_ENV,因此_ENV它本身永远不是块中的自由名称.[...]
用作值的任何表
_ENV称为环境.Lua保持着一个称为全球环境的杰出环境.此值保存在C注册表中的特殊索引处.在Lua中,全局变量
_G使用相同的值进行初始化.(_G从不在内部使用.)当Lua加载块时,其
_ENVupvalue 的默认值是全局环境.因此,默认情况下,Lua代码中的自由名称是指全局环境中的条目
我的理解是,每块装,因为_ENV是第一的upvalue,它指出,全球环境表,通过指出_G的load.
> =_G, _ENV
table: 006d1bd8 table: 006d1bd8
Run Code Online (Sandbox Code Playgroud)
确认两者都指向同一张表.手册陈述,而不是多次保证,_ENV并且_G只是普通的名称,没有隐藏的意义,Lua本身不在内部使用它.我在下面尝试了这个块:
local a = { }
local b = a -- since tables are objects, both refer to the same table object
print(a, b) -- same address printed twice
a = { } -- …Run Code Online (Sandbox Code Playgroud)