第一版是為 Lua 5.0 編寫的。儘管對後續版本仍然適用,但存在一些差異。
第四版針對 Lua 5.3,可在 Amazon 和其他書店購買。
購買本書,您還可以幫助 支持 Lua 項目


2.4 – 字符串

字符串具有通常的含義:一個字符序列。Lua 是八位元組乾淨的,因此字符串可以包含具有任何數值(包括嵌入式零)的字符。這意味著您可以將任何二進制數據儲存在字符串中。Lua 中的字符串是不可變值。您不能像在 C 中那樣更改字符串中的字符;相反,您需要使用所需的修改創建一個新字符串,如下一個示例所示

    a = "one string"
    b = string.gsub(a, "one", "another")  -- change string parts
    print(a)       --> one string
    print(b)       --> another string

Lua 中的字符串像所有 Lua 對象一樣受到自動記憶體管理的約束。這意味著您不必擔心字符串的分配和取消分配;Lua 會為您處理這些操作。一個字符串可以包含一個字母或一整本書。Lua 非常有效率地處理長字符串。在 Lua 中,使用 100K 或 1M 個字符來處理字符串的程式並不少見。

我們可以使用匹配的單引號或雙引號來界定文字字符串

    a = "a line"
    b = 'another line'
從風格的角度來看,您應該始終在程式中使用同一類型的引號(單引號或雙引號),除非字符串本身有引號;然後您使用另一種引號,或使用反斜槓轉義這些引號。Lua 中的字符串可以包含以下類似的 C 轉義序列
\a鈴聲
\b退格
\f換頁
\n換行
\r回車
\t水平製表符
\v垂直製表符
\\反斜槓
\"雙引號
\'單引號
\[左方括號
\]右方括號

我們在以下示例中說明它們的使用

    > print("one line\nnext line\n\"in quotes\", 'in quotes'")
    one line
    next line
    "in quotes", 'in quotes'
    > print('a backslash inside quotes: \'\\\'')
    a backslash inside quotes: '\'
    > print("a simpler way: '\\'")
    a simpler way: '\'

我們還可以通過轉義序列 \ddd 來指定字符串中的字符,其中 ddd 是最多三個十進制數字的序列。作為一個有點複雜的示例,兩個文字 "alo\n123\""'\97lo\10\04923"' 在使用 ASCII 的系統中具有相同的值:97 是 a 的 ASCII 碼,10 是換行符的碼,49(示例中的 \049)是數字 1 的碼。

我們也可以透過比對雙重方括號 [[...]] 來界定字串文字。這種括號形式的字串文字可以跨越多行,可以巢狀,而且不會解析跳脫序列。此外,如果字串的第一個字元是換行符號,這種形式會忽略它。這種形式特別適合用來撰寫包含程式區段的字串;例如,

    page = [[
    <HTML>
    <HEAD>
    <TITLE>An HTML Page</TITLE>
    </HEAD>
    <BODY>
     <A HREF="https://lua.dev.org.tw">Lua</A>
     [[a text between double brackets]]
    </BODY>
    </HTML>
    ]]
    
    write(page)

Lua 在執行時會自動在數字和字串之間進行轉換。任何套用在字串上的數字運算都會嘗試將字串轉換成數字

    print("10" + 1)           --> 11
    print("10 + 1")           --> 10 + 1
    print("-5.3e-10"*"2")     --> -1.06e-09
    print("hello" + 1)        -- ERROR (cannot convert "hello")
Lua 不僅在算術運算子中套用此類強制轉換,也會在其他需要數字的地方套用。相反地,Lua 只要在需要字串的地方找到數字,就會將數字轉換成字串
    print(10 .. 20)        --> 1020
(.. 是 Lua 中的字串串接運算子。當你將它寫在數字後面時,必須用空白隔開;否則,Lua 會將第一個點視為小數點。)

儘管有這些自動轉換,字串和數字還是不同的東西。像 10 == "10" 這樣的比較永遠都是錯的,因為 10 是數字,而 "10" 是字串。如果你需要明確地將字串轉換成數字,可以使用函式 tonumber,如果字串沒有表示適當的數字,它會傳回 nil

    line = io.read()     -- read a line
    n = tonumber(line)   -- try to convert it to a number
    if n == nil then
      error(line .. " is not a valid number")
    else
      print(n*2)
    end

若要將數字轉換成字串,你可以呼叫函式 tostring 或將數字與空字串串接

    print(tostring(10) == "10")   --> true
    print(10 .. "" == "10")       --> true
此類轉換永遠都是有效的。