在 Scala 中,字符串插值是通过在字符串前添加特定前缀实现的,主要有三种标准插值器:s
、f
和 raw
。它们的核心用法如下:
1. s 插值器(简单插值)
- 作用:将变量或表达式直接嵌入字符串。
- 语法:
s"..."
+$变量名
或${表达式}
- 示例:
scala复制代码
val name = "Alice" val age = 30 val str = s"Name: $name, Age: $age" // 直接引用变量 // 输出:Name: Alice, Age: 30val calc = s"Next year: ${age + 1}" // 表达式需用 {} 包裹 // 输出:Next year: 31
2. f 插值器(格式化插值)
- 作用:支持类似
printf
的格式化输出,类型安全。 - 语法:
f"..."
+%格式化符
- 示例:
scala复制代码
val height = 1.75 val str = f"Height: $height%.2f meters" // 保留两位小数 // 输出:Height: 1.75 metersval num = 10 val padded = f"Number: $num%04d" // 补零到4位 // 输出:Number: 0010
- 注意:格式化符需与变量类型匹配(如
%d
用于整数,%s
用于字符串)。
3. raw 插值器(原始字符串)
- 作用:禁用转义字符处理,直接输出原始内容。
- 语法:
raw"..."
- 示例:
scala复制代码
val path = raw"C:\Users\Alice\note.txt" // \n 不会被转义为换行 // 输出:C:\Users\Alice\note.txt
4. 自定义插值器(高级用法)
可通过实现 StringContext
的方法自定义插值器,例如:
scala复制代码
implicit class JsonInterpolator(val sc: StringContext) extends AnyVal {def json(args: Any*): String = {// 自定义逻辑(如生成 JSON)s"JSON: ${args.mkString}"}
}val key = "name"
val value = "Bob"
val jsonStr = json"key=$key, value=$value" // 自定义插值器
// 输出可能:JSON: key=name, value=Bob
注意事项
- 前缀必须紧接字符串:
s"..."
不能写成s "..."
(空格会报错)。 - 表达式需用
{}
包裹:复杂表达式如${user.getName.toUpperCase}
。 - 类型安全:
f
插值器会检查格式化符与变量类型是否匹配。 - 隐式转换:插值器本质是通过隐式类扩展
StringContext
实现的。
对比其他语言
- 类似 Python 的 f-string:
f"{name}"
vs Scala 的s"$name"
。 - 类似 JavaScript 模板字符串:
${name}
vs Scala 的${name}
。