如何编写一个函数来确定它的表参数是否为真数组?
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)
我看不出有什么方法可以找出数字键是否是唯一的键.
我可能错过了这个,但有没有内置的方法将lua表序列化/反序列化为文本文件,反之亦然?
我有一对方法来在具有固定格式的lua表上执行此操作(例如,3列数据,5行).
有没有办法做到这一点与任何LUA表任意格式?
举个例子,给出这个lua表:
local scenes={
{name="scnSplash",
obj={
{
name="bg",
type="background",
path="scnSplash_bg.png",
},
{
name="bird",
type="image",
path="scnSplash_bird.png",
x=0,
y=682,
},
}
},
}
Run Code Online (Sandbox Code Playgroud)
它将被转换为这样的文本:
{name="scnSplash",obj={{name="bg",type="background",path="scnSplash_bg.png",},{name="bird", type="image",path="scnSplash_bird.png",x=0,y=682,}},}
Run Code Online (Sandbox Code Playgroud)
只要文本字符串可以反序列化为空的lua表,就可以以任何方式定义序列化文本的格式.
我想在字符串中获得最常见的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 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) 由于数字索引,我不确定这是否可能,但希望有人能指出正确的方向。
给定表:
t = { 13, 200, 12, 15, 23 }
Run Code Online (Sandbox Code Playgroud)
如何使用数字嵌套表格?
t["200"] = {"stuff", "more stuff", "even more stuff"}
Run Code Online (Sandbox Code Playgroud)
似乎不起作用,因为它会创建一个位置 200 并用 null 填充空单元格。我会添加一个字母作为后缀/前缀,但问题是试图对表进行数字排序。这是否可能,或者我是否坚持使用不同的方法?谢谢!
由于认识而略有编辑:
t["200"] = {"stuff", "more stuff", "even more stuff"}
Run Code Online (Sandbox Code Playgroud)
实际上创建了一个键“200”,而:
t[200] = {"stuff", "more stuff", "even more stuff"}
Run Code Online (Sandbox Code Playgroud)
创建索引 200,其他所有内容均为空。
我能够将函数存储到表中.但现在我不知道如何调用它们.最终表将有大约100个调用,所以如果可能的话,我想像在foreach循环中一样调用它们.谢谢!
以下是表的定义方式:
game_level_hints = game_level_hints or {}
game_level_hints.levels = {}
game_level_hints.levels["level0"] = function()
return
{
[on_scene("scene0")] =
{
talk("hint0"),
talk("hint1"),
talk("hint2")
},
[on_scene("scene1")] =
{
talk("hint0"),
talk("hint1"),
talk("hint2")
}
}
end
Run Code Online (Sandbox Code Playgroud)
Aaand函数定义:
function on_scene(sceneId)
-- some code
return sceneId
end
function talk(areaId)
-- some code
return areaId
end
Run Code Online (Sandbox Code Playgroud)
编辑:
我修改了函数,因此它们会有更多的上下文.基本上,他们现在返回字符串.而我希望发生的是,在调用函数的最后,我将有一个包含所有这些字符串的表(理想情况下是level表).
我有关于lua表的使用的内存泄漏问题,代码如下:
function workerProc()
-- a table holds some objects (userdata, the __gc is implememted correctly)
local objs = {createObj(), createObj(), ...}
while isWorking() do
-- ...
local query = {unpack(objs)}
repeat
-- ...
table.remove(query, queryIndex)
until #query == 0
sleep(1000)
end
end
Run Code Online (Sandbox Code Playgroud)
objs使用一些userdata对象初始化表,并且这些对象在while循环中始终可用,因此不会对这些obj执行gc.在while循环中,query表objs使用来自(使用解包函数)的所有元素进行初始化.在运行脚本的过程中,我发现内存不断增加但是当我注释掉local query = {unpack(objs)}它时就会消失.
我不认为这段代码有内存泄漏问题导致queryvar是本地的,并且在每次迭代while循环后它应该是不可用的,但事实是.有谁知道为什么内存会被那个表吞噬?
如何在C中获得Lua表的大小?
static int lstage_build_polling_table (lua_State * L) {
lua_settop(L, 1);
luaL_checktype(L, 1, LUA_TTABLE);
lua_objlen(L,1);
int len = lua_tointeger(L,1);
printf("%d\n",len);
...
}
Run Code Online (Sandbox Code Playgroud)
我的Lua代码:
local stages = {}
stages[1] = stage1
stages[2] = stage2
stages[3] = stage3
lstage.buildpollingtable(stages)
Run Code Online (Sandbox Code Playgroud)
它总是打印0.我究竟做错了什么?
我有一个项目,该项目在无法使用实际数据库的环境中需要类似结构的关系数据库。语言仅限于 Lua,这远不是我最强的语言。我有一个表格结构如下:
table={
m:r={
x=1
y=1
displayName="Red"
}
m:y={
x=1
y=2
displayName="Yellow"
}
}
Run Code Online (Sandbox Code Playgroud)
构建、存储和检索表非常简单。我遇到问题的地方是搜索它。为了清楚起见,如果我可以使用 SQL,我会这样做:
SELECT * FROM table WHERE displayName="Red"
Run Code Online (Sandbox Code Playgroud)
是否有 Lua 函数可以让我以这种方式搜索?
有没有更短的方法来做到这一点:
local thisismytable = {
non = sequitur
}
thisismytable.whatismytable = thisismytable
Run Code Online (Sandbox Code Playgroud)
任何帮助,将不胜感激.我不想重新创建预先存在的功能.
lua ×10
lua-table ×10
arrays ×1
c ×1
coronasdk ×1
dictionary ×1
environment ×1
function ×1
hash ×1
lua-5.1 ×1
lua-api ×1
memory ×1
memory-leaks ×1
nested ×1
search ×1