内插字符串是允许将 F# 表达式嵌入其中的 字符串 。 它们在各种情况下非常有用,其中字符串的值可能会根据值或表达式的结果而更改。
语法
$"string-text {expr}"
$"string-text %format-specifier{expr}"
$"""string-text {"embedded string literal"}"""
$$"""string-text %%format-specifier{{expr}}"""
注解
内插字符串允许在字符串文本内的“漏洞”中编写代码。 下面是一个基本示例:
let name = "Phillip"
let age = 30
printfn $"Name: {name}, Age: {age}"
printfn $"I think {3.0 + 0.14} is close to {System.Math.PI}!"
每个 {}
大括号对之间的内容可以是任何 F# 表达式。
若要转义大括号对,请编写其中两个 {}
,如下所示:
let str = $"A pair of braces: {{}}"
// "A pair of braces: {}"
类型内插字符串
内插字符串还可以具有 F# 格式说明符来强制实施类型安全性。
let name = "Phillip"
let age = 30
printfn $"Name: %s{name}, Age: %d{age}"
// Error: type mismatch
printfn $"Name: %s{age}, Age: %d{name}"
在上一示例中,代码错误地传递 age
应位于何处 name
的值,反之亦然。 由于内插字符串使用格式说明符,因此这是一个编译错误,而不是一个微妙的运行时 bug。
逐字内插字符串
F# 支持带有三引号的逐字内插字符串,以便可以嵌入字符串文本。
let age = 30
printfn $"""Name: {"Phillip"}, Age: %d{age}"""
格式说明符
格式说明符可以是 printf 样式或 。NET 样式。 Printf 样式说明符是在大括号前用 纯文本格式覆盖的说明符。 例如:
let pi = $"%0.3f{System.Math.PI}" // "3.142"
let code = $"0x%08x{43962}" // "0x0000abba"
格式说明符 %A
对于生成结构化 F# 数据的诊断输出特别有用。
let data = [0..4]
let output = $"The data is %A{data}" // "The data is [0; 1; 2; 3; 4]"
.NET 样式说明符是可在大括号内:
放置的那些可用String.Format说明符。 例如:
let pi = $"{System.Math.PI:N4}" // "3.1416"
let now = $"{System.DateTime.UtcNow:``yyyyMMdd``}" // for example, "20220210"
如果为 .NET 样式说明符包含异常字符,然后可以使用双反杆对其进行转义:
let nowDashes = $"{System.DateTime.UtcNow:``yyyy-MM-dd``}" // for example, "2022-02-10"
在内插字符串中对齐表达式
可以在内插字符串 |
内左对齐或右对齐表达式,以及空格数的规范。 以下内插字符串分别将左右表达式与左侧和右侧对齐 7 个空格。
printfn $"""|{"Left",-7}|{"Right",7}|"""
// |Left | Right|
内插字符串和 FormattableString
格式设置
还可以应用符合以下规则的格式 FormattableString:
let speedOfLight = 299792.458
printfn $"The speed of light is {speedOfLight:N3} km/s."
// "The speed of light is 299,792.458 km/s."
此外,还可以通过类型注释将内插字符串作为类型 FormattableString 检查:
let frmtStr = $"The speed of light is {speedOfLight:N3} km/s." : FormattableString
// Type: FormattableString
// The speed of light is 299,792.458 km/s.
请注意,类型注释必须位于内插字符串表达式本身上。 F# 不会隐式将内插字符串转换为 FormattableString.
字符串内插的扩展语法
从 F# 8 开始,使用包含多个{
}
或%
字符的文本时,可以使用扩展字符串内插语法来消除转义的需求。
三引号字符串文本可以以多个 $
字符开头,这会更改打开和关闭内插所需的大括号数。
在这些字符串文本中}
,{
不需要转义字符:
let str = $$"""A string containing some {curly braces} and an {{"F#" + " " + "expression"}}."""
// "A string containing some {curly braces} and an F# expression."
let another = $$$"""A string with pairs of {{ and }} characters and {{{ "an F# expression" }}}."""
// "A string with pairs of {{ and }} characters and an F# expression."""
格式说明符所需的字符数 %
受到相同的影响:
let percent = $$"""50% of 20 is %%.1f{{20m * 0.5m}}"""
// "50% of 20 is 10.0"