仓颉编程快速上手
上QQ阅读APP看书,第一时间看更新

3.2.2 使用字符串类型存储多个字符

字符串类型用于表示文本数据,可以包含多个有序的Unicode字符,用String表示。字符串类型字面量有3种形式:单行字符串字面量、多行字符串字面量和多行原始字符串字面量。

1.单行字符串字面量

单行字符串字面量只能书写在一行,不允许跨越多行。单行字符串字面量以一对双引号定义,双引号内可以是任意数量的任意Unicode字符(除双引号和单独出现的“\”外)。字符串中可以使用转义字符。举例如下:

let str1: String = ""                 // 空字符串,包含0个字符
let str2: String = "X"                // 只包含1个字符的String
let str3: String = "你好仓颉"           // 包含多个字符的String
let str4: String = "你好\t仓颉"        // 包含转义字符的String
let str5: String = "\"你好仓颉\""       // String中的双引号必须使用转义字符

在读取单行字符串时,仓颉将自左边遇到的第1个双引号作为字符串开始的标志,双引号之后的字符就是字符串本身的内容,直到遇到第2个与之配对的双引号,表示字符串结束。因此,表示字符串界限的双引号总是成对出现的(定义Rune类型的单引号同理)。

如果使用println函数来输出字符串,那么表示界限的双引号本身是不会被输出的。

println("你好仓颉")  // 输出:你好仓颉

如果需要在字符串内部使用双引号,可以使用转义字符“\"”。例如,在上面示例的str5中,就使用了两个转义的双引号。如果使用println(str5)将str5输出,那么结果为:

"你好仓颉"

需要注意的是,反斜线(\)不能单独出现在Rune或String(除多行原始字符串外)中。如果需要在Rune或String中使用字符“\”,可以使用转义字符“\\”来表示反斜线。

以下是两个错误的字符串字面量示例。

"\"

由于反斜线的作用是对其后面的字符进行转义,因此"\"中的反斜线会对其后的第2个双引号进行转义,从而使得该字面量只有定义左边界限的双引号,而没有与之配对的右双引号,导致编译错误。

"Hello\World"

"Hello\World"中的“\W”会被当作转义字符去理解(但是“\W”不是一个合法的转义字符),导致编译错误。

2.多行字符串字面量

多行字符串字面量允许跨越多行,并且用3对双引号定义:以3个双引号开头,紧接着必须换行(否则编译报错),然后是字面量的内容(可以跨越多行),最后以3个双引号结尾。举例如下:

let str1: String = """
        """
 
let str2: String = """
        莫听穿林打叶声,
        何妨吟啸且徐行。
        竹杖芒鞋轻胜马,
        谁怕?
一蓑烟雨任平生。"""

3.多行原始字符串字面量

多行原始字符串字面量用若干对井号(#)和一对双引号("")定义:以一个或多个井号加上1个双引号开始,接着是字符串内容,最后以1个双引号加上与开始时相同个数的井号结束。字符串内可以是任意数量的任意Unicode字符,并且可以跨越多行。举例如下:

let str1: String = #""#
let str2: String = ##"\"##
let str3: String = ###"
    大江东去,
    浪淘尽,
    千古风流人物。
"###

多行原始字符串字面量中的所有内容都会保持原样(转义字符不会被转义),常常用于表示文件路径、网络地址等场合。例如,对于C盘目录tools下的文件WordProcessor.docx的文件路径,如果使用单行字符串字面量来表示,那么只能写作:

"C:\\tools\\WordProcessor.docx"  // 使用转义字符“\\”表示反斜线

而不能写作:

"C:\tools\WordProcessor.docx"

因为其中的“\t”和“\W”会被理解为转义字符,所以就不能正确表示文件路径。

这只是一个层次较少的文件路径。如果文件路径的层次较多,那么使用转义字符会比较烦琐,影响可读性,此时可以使用多行原始字符串字面量来表示。如果使用多行原始字符串字面量来表示以上路径,那么可写作:

#"C:\tools\WordProcessor.docx"#