创建Lua函数以避免在同一文件中重复使用代码。

我有以下代码类型,在同一文件中使用了 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

为了避免重复,我想在此使用函数。这样,我只需调用函数即可获得打印结果。 由于每个 match 函数中的参数都不同。 用双引号 ("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)
点赞
用户444708
用户444708

你可以在字符串表中创建可以像 match 和 find 一样工作的函数,做法如下:

function string.ReadArgument( str, pattern )
  return null_value( str:match( pattern ) )
end

你可以在你的代码中像这样使用它:

a = split:ReadArgument( "(.-)%s" )
b = split:ReadArgument( "tx=(%a+)" )

等等。

2012-06-06 11:36:13
用户501459
用户501459

不太清楚你在问什么。你想要消除哪些重复?你可以通过将模式放入列表中,并在循环中执行来消除 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))

提示:

  1. 你在任意和不必要地将变量放在括号中。split:match(patt) 的意思与 (split):match(patt) 相同。

  2. 你没有使用本地变量。变量的范围越大,改变代码的一部分就可能会对与之无关的远程代码产生不利影响,这很难理解和调试。你应该尽可能地将变量设置为本地变量,这在 Lua 中也更快。

2012-06-06 17:25:37