2009-09-10 66 views
31

在許多語言中,您可以連接變量賦值上的字符串。我有一個場景,使用Lua編程語言,我需要將命令的輸出附加到現有變量。在下面的例子中,Lua中是否有相同的功能?其他語言的Lua中字符串的連接

例子:

===== PERL ===== 
$filename = "checkbook"; 
$filename .= ".tmp"; 
================ 

===== C# ===== 
string filename = "checkbook"; 
filename += ".tmp"; 
=============== 

預先感謝您的幫助。

回答

62

正如其他答案所說,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也可以作爲值存儲),因此找到字符串表示形式作爲練習留給學生。不要忘記樹木和更復雜的表格結構。

1

字符串可以使用連接運算符連接在一起「」

這是變量我認爲同樣

6

級聯:

Lua中字符串連接操作符記兩個點('..')。如果兩個操作數都是字符串或數字,則根據§2.2.1中提到的規則將它們轉換爲字符串。否則,稱爲「concat」metamethod(參見§2.8)。

來自:http://www.lua.org/manual/5.1/manual.html#2.5.4

15

如果你問是否有運營商..的速記版本 - 沒有沒有。你不能寫a ..= b。你必須完整輸入:filename = filename .. ".tmp"