奇思妙想 · 2024年 9月 18日 0

哪些编程语言支持字符串插值?

50 次浏览

字符串插值并不是什么特别的技术,如果编程语言允许,字符串插值的引入并非难事。早期的一些编程语言,也许不认为这没有足够大的魅力让编程语言支援此功能,当然也有兼容代码的考量。某些编程语言又把字符串插值称为模板表达式。

  • C/ObjC/C++都没有字符串插值,可以用格式串%模拟插值。C++20引入的format方法让格式串更简约,可以不需要格式串类型,用{}或{<digit>}即可。
  • C# 6.0引入了字符串插值,本质是编译器将字符串中的大括号当成表达式,编译器可以解析求值并插入字符串中。
  • Python 3.6也引入了f-string字符串。
  • Swift也有字符串插值,格式稍微有些不同:print("hello, \(name)")
  • Rust没有字符串插值,和C++20 format方法的格式串有点像,用{}占位符。
  • Java没有字符串插值,只能+模拟字符串拼接。Java 15引入formatted方法,依然比较笨重:
    "hello, %s".formatted(name)
  • Go也不支持字符串插值,利用形如C语言%格式串%s或者用"+"实现字符串拼接。
  • JS ECMAScript 2015 (ES6) 开始支持字符串插值,不过它的叫法是模板字面量,不是普通用单引号或双引号标识的字符串,而是用反引号:
    let name = "JS";
    console.log(`Hello, ${name}!`); // Hello, JS!
    如果是单引号,console.log(‘Hello, ${name}!‘); // Hello, ${name}!
  • VB.NET之前的VB不支持字符串插值,允许&做字符串拼接。VB 14属于VB.NET,开始支持字符串插值,可参考:内插字符串 - Visual Basic | Microsoft Learn
    Console.WriteLine($"Hello, {name}!")
  • 仓颉 支持用 ${expression} 做字符串插值。注意,基本变量或表达式都可以,表达式可以包含多个声明表达式,以分号作为分隔符,最后一个是此插值的值。
    例如:str = "the str is: ${let a = 1; a + 1}" 此字符串最终为the str is: 2
  • Kotlin 支持${变量/函数/表达式}做字符串插值,对于单独变量,也可以省略大括号。
    • 如果变量没有大括号作为字符串插值,例如$a1,在同时定义变量a和a1时,会默认指代变量a1.

字符串插值和其他技术组合

  • C#允许字符串插值$和逐字字符串@同时使用,C# 8.0之前要求必须$在前面,@在后面,C# 8.0之后两种都允许。
  • Kotlin 允许原生字符串中用插值字符串。这造就了,原生字符串用如下三种形式都是表示单独的字符 $:
    • $ ${"$"} ${'$'}

字符串插值的本质

  • C# 字符串插值本质是一个语法糖,插值的变量被组装成object数组,利用string.Format()方法输出。

字符串插值的组合

  • C# 也支持多个带插值字符串拼接,比如$"hello {a}" + $"world, {b}".