第一版是为 Lua 5.0 编写的。虽然在很大程度上仍然适用于更高版本,但有一些区别。
第四版针对 Lua 5.3,可在 亚马逊 和其他书店购买。
购买本书,您还将帮助支持 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 是最多三个十进制数字的序列。作为一个稍微复杂的示例,在使用 ASCII 的系统中,两个字面量 "alo\n123\""'\97lo\10\04923"' 具有相同的值:97 是 a 的 ASCII 代码,10 是换行符的代码,49(示例中的 \049)是数字 1 的代码。

我们还可以通过匹配双方括号 [[...]] 来分隔字符串字面量。此类括号形式的字面量可以跨多行运行,可以嵌套,并且不解释转义序列。此外,当字符串的第一个字符是换行符时,此形式会忽略该字符。此形式对于编写包含程序片段的字符串特别方便;例如,

    page = [[
    <HTML>
    <HEAD>
    <TITLE>An HTML Page</TITLE>
    </HEAD>
    <BODY>
     <A HREF="https://lua.ac.cn">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
此类转换始终有效。