我有两张表,例如:
table1 = { element1, element2, element3, element4 }
table2 = { element1, element3 }
Run Code Online (Sandbox Code Playgroud)
表2引用了表1的一些元素,但我不知道到底是哪一个,也不知道它们的索引。现在,对于特定元素,我想检查 table2 是否包含它,并将其插入/删除。
我首先想到的是:
table.remove/insert(table2, table1.elementX)
Run Code Online (Sandbox Code Playgroud)
但是由于插入/删除是通过索引进行查找的,所以这是行不通的。当然,我可以遍历整个表,直到找到该元素并将其删除,直到迭代完成但没有匹配为止并插入它。
但是有没有更高效的方法来做到这一点?
我不想用空字段填充 table2 以将元素放在匹配的索引上。
每个消息来源都同意这一点:
在实际使用中,主要区别在于如何处理变量,因为它仅限于范围并且无法从代码的任何点访问。
从理论上讲,局部变量可以避免非法更改,因为它无法从错误的位置访问,而且更好的是,查找 var 的性能要高得多。
现在我想知道这个概念的细节;从技术上讲,它是如何工作的,代码的某些部分可以访问,而其他部分则不能?性能提升了多少?
但主要问题是: 让我们提一下我有一个 var bazinga =“So Cool”。并想从某个地方改变它。由于字符串是公共的,我可以轻松做到这一点。但现在,如果它被声明为本地的并且我超出了范围,那么如果我通过像这样的 X 函数移交变量,那么为了获得访问权限,需要付出什么性能努力:
func_3(bazinga)
func_N(bazinga)
end
func_2(bazinga)
func_3(bazinga)
end
func_1()
local bazinga = "So cool."
func_2(bazinga)
end
Run Code Online (Sandbox Code Playgroud)
在这一点上,局部变量的性能不断提高,为什么?
我问你,由于维护将对象移交给许多函数的代码变得一团糟,我想知道这是否真的值得。
我在几个表中得到了几个对象。多个功能更改对象并将其移交给其他功能。
假设我的表是这样的:
objectTable = {obj1, obj2, obj3}
otherobjTable = {objA, objB, objC, objD}
Run Code Online (Sandbox Code Playgroud)
假设这些是在 main.lua 中初始化的。
现在,当跟踪 obj1 时,它被一个函数改变,该函数改变它并提供对另一个函数的引用,另一个函数又改变它。一个步骤可能如下所示:
function()
if something then func(obj_1)
elseif something else then func(obj_2)
elseif something other then func(obj_3)
//... and so on...
end
function func(received_Object)
if something then
table.insert(received_Object, a value)
end
callAnotherFunction(received_Object)
end
function callAnotherFunction(received_Object)
if input == "Delete it" then
local name = received_Object.name
received_Object = nil
return string.format("%s was deleten", name)
else
return false
end
end
Run Code Online (Sandbox Code Playgroud)
现在的问题是,在received_Object = nil 之后 …
给定是一个(时间 - 值)字符串,如:
local dt = "12:34:56"
Run Code Online (Sandbox Code Playgroud)
我想把这个字符串剪成
hh, mm, ss = "12", "34", "56"
Run Code Online (Sandbox Code Playgroud)
因此我使用这样的正则表达式:
local hh = string.format("%02d", tonumber( dt:gsub(":..:..","") ))
local mm = string.format("%02d", tonumber( dt:gsub(":..:",""):gsub(":","") ))
local ss = string.format("%02d", tonumber( dt:gsub("..:..:","") ))
Run Code Online (Sandbox Code Playgroud)
哪个工作正常.(时间字符串来自userinput,所以如果用户写"1"而不是"01",我将其填充为0)
但是在值从0开始的情况下,它超出了luas tonumber()的范围(我猜是签名为零),与"1"相同,tonumber()似乎不能处理低于"2"的值.)任何人都可以告诉我该如何处理这种情况?
除此之外,如果你能告诉我正则表达式中的不良练习,我会很高兴,如果有的话.
我得到了这个代码,其中"call_name"似乎保持为零.
function mdbTest(conf)
if conf.m_string:sub(6,9) == "MBUS" then
local print_name, call_name = "MBUS","mbus"
else
local print_name, call_name = "MDB","mdb"
end
local port_handler = rawio.open(string.format("/dev/%s",call_name))
end
Run Code Online (Sandbox Code Playgroud)
最后,这不是一个真正的问题,因为我可以将call_name设为public,但我想知道为什么会这样.有人可以解释一下吗?
谢谢.
lua ×5
local ×2
lua-table ×2
global ×1
insert ×1
iteration ×1
lua-patterns ×1
memory ×1
null ×1
numbers ×1
parameters ×1
performance ×1
reference ×1
regex ×1