我有以下类型的代码,我在同一文件中使用了 6-7 次:
str=(line):match("constraints(.*)end")
for split in string_gsplit(str, 'n', true) do
if
string.match(split,'%a+')
then
a=(split):match("(.-)%s")
a=null_value(a)
b=(split):match("tx=(%a+)")
b=null_value(b)
c=(split):match("ty=(%a+)")
c=null_value(c)
d=(split):match("tz=(%a+)")
d=null_value(d)
e=(split):match("rx=(%a+)")
e=null_value(e)
f=(split):match("ry=(%a+)")
f=null_value(f)
g=(split):match("rz=(%a+)")
g=null_value(g)
print(a..b..c..d..e..f..g)
end
end
为了避免重复,我想在其中使用函数。这样我只调用函数并获得打印结果。由于每个匹配函数中的参数都不同。双引号 ("abc") 中给出的字符串不同,不能相同。请帮助我创建一个函数。
我试图创建它。看一看:
function f(s)
assert(type(s) == "string")
str=(line):match(s)
for split in string_gsplit(str, 'n', true) do
if
string.match(split,'%a+')
then
end
end
return s
end
为了调用相同的函数,我键入:
s="constraints(.*)end"
f(s)
不清楚你要什么。您要删除哪些重复项?split:match
列表 - null_value
行?您可以通过将模式放在列表中来循环执行此操作:
local patterns = { "(.-)%s", "tx=(%a+)", "ty=(%a+)", "tz=(%a+)", "rx=(%a+)", "ry=(%a+)", "rz=(%a+)" }
local results = {}
for i,pattern in ipairs(patterns) do
results[#results+1] = null_value( split:match(pattern) )
end
print(table.concat(results))
技巧:
您任意且不必要地将变量放在括号中。
split:match(patt)
的意思与(split):match(patt)
相同。您没有使用本地人。变量的范围越大,代码某一部分的更改对代码中某些遥远的、不相关的部分产生不利影响的风险就越大,这很难推理和调试。你应该尽可能将变量放在局部,这在Lua中也恰好更快。
您可以在字符串表上创建类似匹配和查找的函数:
function string.ReadArgument( str, pattern )
return null_value( str:match( pattern ) )
end
你会像这样在代码中使用
a = split:ReadArgument( "(.-)%s" )
b = split:ReadArgument( "tx=(%a+)" )
等等。