0

同じファイルで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) 
4

2 に答える 2

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 ではたまたま高速です。

于 2012-06-06T17:25:37.690 に答える
0

文字列テーブル上に、matchのように機能し、次のように検索する関数を作成できます。

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

このようにコードで使用するもの

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

等々。

于 2012-06-06T11:36:13.147 に答える