正如其他答案所說,Lua中的字符串連接運算符是兩個點。
你簡單的例子是這樣寫的:
filename = "checkbook"
filename = filename .. ".tmp"
但是,需要注意的一個警告。由於Lua中的字符串是不可變的,每個連接都會創建一個新的字符串對象,並將源字符串中的數據複製到它。這使得連續連接到單個字符串的性能非常差。
的的Lua成語對於這種情況是這樣的:
function listvalues(s)
local t = { }
for k,v in ipairs(s) do
t[#t+1] = tostring(v)
end
return table.concat(t,"\n")
end
通過收集字符串數組t
要連接,標準庫例程table.concat
可以用來連接它們加起來(連同每對之間的分隔符字符串)而不需要不必要的字符串複製
更新:我剛剛注意到我最初使用pairs()
而不是ipairs()
寫了上面的代碼片段。
正如最初所寫,功能listvalues()
確實會從傳入的表中產生每個值,但不會以穩定或可預測的順序產生。另一方面,它將包括在1
到#s
範圍內誰的密鑰不是正整數的值。這就是pairs()
所做的:它產生存儲在表中的每一個(鍵,值)對。
在大多數情況下,如果您使用類似listvaluas()
的東西,您會有興趣保留訂單。因此,編寫爲listvalues{13, 42, 17, 4}
的調用將按照該順序生成包含這些值的字符串。但是,pairs()
不會這樣做,它將按照某種順序逐項列出,這取決於表數據結構的底層實現。衆所周知,訂單不僅取決於按鍵,還取決於按鍵的插入順序和其他按鍵的移除順序。
當然ipairs()
也不是一個完美的答案。它僅列舉形成「序列」的表格的那些值。也就是說,那些鍵的值形成了從1到一些上限的連續塊,這通常也是由運算符返回的值。 (在很多情況下,函數ipairs()
本身可以更好地被更簡單的for
循環代替,循環的計數從1
到#s
。這是Lua 5.2和LuaJIT推薦的做法,其中簡單的for
循環可以比迭代器ipairs()
更有效地實現)
如果pairs()
確實是正確的方法,那麼通常情況下,您希望同時打印鍵和值。這通過使數據自我描述來減少對訂單的擔憂。當然,由於任何Lua類型(nil
和浮點數NaN
除外)都可以用作關鍵字(並且NaN
也可以作爲值存儲),因此找到字符串表示形式作爲練習留給學生。不要忘記樹木和更復雜的表格結構。