2.4.1 什么是字符串?
字符串(String)就是一串字符的组合,用来表示文本数据。你可以把它理解为"多个 Rune 连在一起"。
Cangjie
let greeting: String = "你好,仓颉"
2.4.2 字符串字面量
仓颉有三种字符串写法:
1. 单行字符串
用一对单引号 '...' 或双引号 "..." 包裹,只能写在一行内:
Cangjie
let s1: String = "" // 空字符串
let s2 = 'Hello Cangjie Lang' // 单引号
let s3 = "\"Hello Cangjie Lang\"" // 双引号内用转义的双引号
let s4 = 'Hello Cangjie Lang\n' // 支持转义字符
ℹ️NOTE
单行字符串中不能直接换行,也不能出现未转义的、与外层相同的引号。
2. 多行字符串
用三个引号 """...""" 或 '''...''' 包裹,可以跨越多行:
Cangjie
let s1: String = """
"""
let s2 = '''
Hello,
Cangjie Lang'''
s2的输出结果是
bash
Hello,
Cangjie Lang
[!IMPORTANTP]
多行字符串会保留里面的换行和缩进,所以格式会原样输出。
3. 多行原始字符串
以 # 加引号开头,不处理转义字符——写什么就是什么:
Cangjie
let s1: String = #""# // 空字符串
let s2 = ##'#'\n'## // 输出:#'\n(\n 不会转义为换行)
let s3 = ###"
Hello,
Cangjie
Lang"### // 换行和缩进会被保留
输出结果
Bash
#'\n
Hello,
Cangjie
Lang
# 的数量决定了结束标记:开头有几个 #,结尾也要有几个 # 配对。
❗IMPORTANT
原始字符串与普通字符串的核心区别:\n、\t 等转义序列不会被转义,而是原样保留。
2.4.3 字符串自动转换为 Byte / Rune
当赋值给 Byte(即 UInt8)或 Rune 类型的变量时,单字符字符串会自动转换:
Cangjie
main() {
var b: Byte = "0" // "0" 的 ASCII 码是 48,自动转为 Byte
print(b) // 输出 48
b = "1" // "1" 的 ASCII 码是 49
print(b) // 输出 49
var r: Rune = "0" // "0" 自动转为 Rune 字符
print(r) // 输出 0
r = "1"
print(r) // 输出 1
}
运行结果:
Bash
484901
ℹ️NOTE
Byte 转换取的是 ASCII 编码值,所以 "0" 变成 48 而不是 0。
2.4.4 插值字符串
插值字符串可以在字符串中直接嵌入变量或表达式,用 ${} 包裹,前面加 $:
Cangjie
main() {
let fruit = "apples"
let count = 10
let s = "There are ${count * count} ${fruit}"
println(s)
let r = 2.4
let area = "The area of a circle with radius ${r} is ${let PI = 3.141592; PI * r * r}"
println(area)
}
运行结果:
Bash
There are 100 apples
The area of a circle with radius 2.400000 is 18.095570
💡TIP
- 最常用的写法是
"${变量名}",如"${count}" ${}里可以写表达式,如${count * count}- 甚至可以在
{}里声明变量,如${let PI = 3.14; PI * r * r} - 插值字符串不适用于多行原始字符串
2.4.5 小结
| 类型 | 写法 | 特点 |
|---|---|---|
| 单行字符串 | '...' 或 "..." |
只能一行,支持转义 |
| 多行字符串 | '''...''' 或 """...""" |
可跨行,支持转义 |
| 多行原始字符串 | #'...'#、#"..."# 等 |
可跨行,不转义,写什么就是什么 |
| 插值字符串 | "${表达式}" |
在字符串中嵌入变量或表达式 |
2.。4.6 常见问题
Q1:单引号和双引号有什么区别?
在仓颉没有区别,效果完全一样。你可以自由选择,只要前后配对就行:
Cangjie
let s1 = "Hello"
let s2 = 'Hello' // 效果一样
Q2:多行字符串的缩进会保留吗?
会的!多行字符串会原样保留所有的换行和空格/制表符。所以你在代码里写的缩进,输出时也会出现:
Cangjie
let s = '''
第一行
第二行(缩进更多)
第三行'''
输出结果:
code
第一行
第二行(缩进更多)
第三行
如果你不想要前面的缩进,可以把引号放在行首。
Q3:原始字符串的 `#` 怎么确定数量?
规则很简单:开头有几个 #,结尾也要有几个 #。如果你要写的文字本身包含 #"#,那就用两个 ## 包起来:
Cangjie
let s = #"他说:"你好啊""# // 一个 # 就够了
let t = ##"这里有个 #"号"## // 文字里有 #",所以用两个 ## 包
💡TIP
大多数时候用一个 # 就够了,只有文字里出现 #" 或 #' 时才需要增加数量。
