string
字符串标识一个字符序列,采用8位编码。Lua字符串是不可变的值,创建后不能再修改内部字符,如果要进行改变字符串的原始值,则会创建新的字符串,原始字符串仍不变。在Lua中,字符串的标识方法可以使用单引号
或者双引号
进行界定。
a = "hello lua,you are good"
b = a
a = "hello lua,you are good" .. ",step by step"
print(a)
-->> hello lua,you are good,step by step
print(b) -- 原来定义的字符串在内存中不变,修改后,会在内存中再创建一个字符串
-->> hello lua,you are good
字符串同其他语言一样,会有一些特殊字符再使用过程中,需要转义,其转义字符为反斜杠
。常用的转义字符,除了以下还有其他的一些转义字符,这里只列出常用的,对于快速开发来说,足够了。如下所示:
转义字符 | 含义 |
---|---|
\n | 换行 |
\r | 回车 |
\t | tab,制表符 |
\\ | 反斜杠 |
\" | 双引号 |
\' | 单引号 |
print("hello,\"lua\",\tThis is \'lua\' script,\nIt\'s very sharp.")
-->> hello,"lua", This is 'lua' script,
-->> It's very sharp.
如果在一个字符串中,需要大量使用转义字符,如有一段示例代码之类的,如果每个字符都使用转义符进行界定,工作量较大,且容易出错。针对这样的情况,Lua字符串可以使用包括在[[
和]]
字符中间的任意字符块,而不需要使用转义字符,并且支持多行。
a = [[
"hello world"
<t>
dfadf
</t>
'lua is good' haha
tie
]]
print(a)
-->> "hello world"
-->> <t>
-->> dfadf
-->> </t>
-- 下面haha之前为制表符
-->> 'lua is good' haha
-->> tie
Lua对字符串与数字的设计,可以说是超越其他语言的设计,或者令人迷惑的设计。Lua对于字符串和数字提供了自动转换,当在字符串上应用数学运算符时,Lua会自动尝试将字符串转为数字,不需要显示转换。
print(5 + "90")
print("34" - "12")
print("45" / "5")
print("23 * 2")
print("str" + 3)
-->> 95.0
-->> 22.0
-->> 9.0
-- 当运算符和数字字符串都包在一起,即运算符也是字符串时,lua不会进行自动转换和运算
-->> 23 * 2
-- 当字符串使用数学运算符链接,但字符串无法成功转为数字时,Lua将会抛出异常
-->> attempt to perform arithmetic on a string value
-->> stack traceback:
-->> in main chunk
-->> [C]: in ?
上面是字符串使用数学运算符的自动转换,相反,如果数字间使用了字符串操作符,Lua也提供了将数字自动转换为字符串的操作。如Lua的字符串链接符为..
,使用两个数字拼接,将得到字符串123 .. 456
print(123 .. 456)
-->> 123456
需要注意,当使用字符串链接符操作数字时,数字和链接符必须使用空格分隔,因为..
连接符与数字的小数点重合。
基于以上,Lua提供了字符串与数字的转换,但有时候难于理解,并且也容易产生错误,在实际开发中,尽量采用显示转换,不要使用自动转换。
实现数字字符串转换时,使用显示转换,Lua提供了两个内置方法:
-
tonumber
将一个字符串转为数字,当无法转为数字时,返回nil
-
tostring
将数字转换为字符串,等价于数字 .. ''
print(tonumber("23") * tonumber("2"))
print(tostring(123) .. tostring(456))
通过在字符串前加上#
前缀可获取字符串长度
a = "hello world!"
b = #a
print(b)
-->> 12
print(#"hello lua.")
-->> 10
网友评论