Lua中的字符串通常表示“一个字符序列”。Lua完全采用8位编码,Lua字符串中的字符可以具有任何数值编码,包括数值0。也就是说,可以将任意二进制数据储存到一个字符串中。
Lua的字符串是不可变的值(immutable values)。不能像在C语言中那样直接修改字符串的某个字符,而是应该根据修改要求来创建一个新的字符串。如下所示:
a = "one string"
b = gsub(a,"one","another") -- 修改字符串的一部分
print(a) --> one string
print(b) --> another string
Lua的字符串和其他Lua对象(例如 table 或函数等)一样,都是自动内存管理机制所管理的对象。这表示无需担心字符串的分配和释放,Lua帮你处理这些事情。一个字符串可以小到只包含一个字母,也可以大道包含整本书。Lua能够高效地处理长字符串。在Lua程序中操作100K或1M的字符串是很常见的。
字面字符串(literal string)需要以一对匹配的单引号或双引号来界定:
a = "a line"
b = 'another line'
根据编程风格,应该坚持在程序中使用相同类型的引号(单引号或双引号)。除非字符串本身包含引号,那么可以使用另外一种引号来界定字面字符串。或者使用反斜杠对引号进行转义。Lua字符串中可以包含类似于C语言中的转义序列,如表2-1所示。
表2-1 Lua字符串中的转义序列
\a | 响铃 | \b | 退格(back space) | \f | 提供表格(form feed) | \n | 换行 | \r | 回车 | \t | 水平 tab | \v | 垂直 tab
| \\ | 反斜杠 | \" | 双引号 | \' | 单引号 |
以下示例说明了他们的用法:
>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>是一个至少3个十进制数字组成的序列。例如,字符串"alo\n123\""与字符串'\97lo \10\04923"'是相同的。因为在使用ASCII的系统中,'a'的ASCII编码是97,“换行(new line)”的编码是10,'1'的ASCII编码是49。
另外,还可以用一对匹配的双方括号来界定一个字母字符串,就像写“块注释”那样。以这种形式书写的字符串可以延伸多行,Lua不会解释其中的转义序列。此外,如果字符串的第一个字符是一个换行字符(new line),那么lua会忽略它。这种写法对于书写那种含有程序代码的字符串尤为有用。如下例:
page = [[
<html>
<head>
<title>An HTML Page</title>
</head>
<body>
<a href="http://www.lua.org">Lua</a>
</body>
</html>
]]
write(page)
Lua提供了运行时的数字与字符串的自动转换。在一个字符串上应用算术操作时,Lua会尝试将中国字符串转换成一个数字:
print("10" + 1) --> 11
print("10 + 1") --> 10 + 1
print("-5.3e - 10" * "2") --> 错误,不支持这种形式
print("10 - 10" * "2") --> 错误,不支持这种形式
print("hello" + 1) -- 错误 (不能转换 "hello")
Lua不仅在算术操作中会施以这种强制转换,还会在其他任何需要数字的地方这么做。相反,在Lua期望一个字符串单却得到一个数字时,他也会将数字转换为字符串:
在Lua中,“..”是字符串连接操作符。当直接在一个数字后面输入他的时候,必须要用一个空格来分隔它。不然,Lua会将一个点理解为一个小数点。
如今,仍不能确定在Lua的设计中,这些自动的强制转换是否算一项好的设计,建议最好不要依赖它们。虽然在某些地方这些转换显得很便利,但它们也给语言和使用它们的程序带来了复杂性。毕竟,字符串和数字是两样不同的东西。比较运算 10 == "10" 总为 false,因为10是一个数字,而“10”是一个字符串。如果需要显式地将一个字符串转换为数字,可以使用函数tonumber。当这个字符串的内容不能表示一个正确的数字时,tonumber将返回nil。
line = read() -- 读取一行
n = tonumber(line) -- 尝试将它转换为一个数字
if n == nil then
error(line .. " is not a vaild number")
else
print(n*2)
end
若要将一个数字转换成字符串,可以调用函数tostring,或者将该数字与一个空字符串相连接:
print(tostring(10) == 10) --> nil
print(10 .. "" == "10") --> 1
这样的转换永远是合法的。 |