2012-06-06 83 views
0

我有以下類型的代碼,我用6-7倍,在同一個文件:創建Lua函數,以避免重複的代碼在同一個文件

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 

調用相同的功能,I型:

s="constraints(.*)end" 
f(s) 
+0

如果你想保持清晰(對於我們和你自己),你應該真的開始縮進你的代碼。看看[Lua風格指南](http://lua-users.org/wiki/LuaStyleGuide)。 – jpjacobs

+0

也給你的變量和函數有意義的名字。稱它們爲a,b,c和f會讓你的代碼非常模糊。給他們打電話說明他們包含的內容,比如姓氏,名稱和地址。 – kikito

回答

0

您可以創建一個工作像匹配的字符串表功能,找到像這樣:

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

你可以在你的代碼中使用這樣的代碼

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

等。

1

這是不是很清楚你要求什麼。你想刪除什麼樣的重複? 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中也會更快。