F# 扩展其字符串插值语法以减少转义

F# 引入新的字符串插值语法

F# 在预览版中引入了一种新的语法特性,旨在简化字符串插值的使用。该语法的主要优势在于允许自定义用于分隔插值表达式的花括号数量,从而减少了对特殊字符进行转义的需求。

适用场景

新语法适用于原样插值字符串,即使用三引号的插值字符串。在此类情况下,F# 允许在三引号字符串前添加单个 $ 符号,这意味着使用 {} 将 F# 表达式嵌入字符串中。

与 C# 的相似性

新语法借鉴了 C# 的字符串插值设计,允许使用双美元符号 $$ 来指定插值表达式由两个花括号 {{}} 开始,而不是单个花括号。

示例

以下示例展示了如何使用新的字符串插值语法,其中无需对单个花括号进行转义:

let json = $$"""
{
  "id": "Some guid",
  "name": "{{user.Name}}",
};

与之前的语法相比,新语法更加简洁:

let json = $"""
\{
  "id": "Some guid",
  "name": "{user.Name}",
\};
"""

主要用途

根据 F# 工程师 Adam Boniecki 的介绍,新语法在生成 CSS 或 JSON 内容时尤为有用,因为这些内容中花括号无处不在,使用旧语法需要大量的转义操作。

你不必遍历所有字符串字面量来查找需要转义的 {}% 字符,你可以像平常一样直接编写(或复制粘贴)它们。

灵活性

新的 F# 语法具有灵活性,允许根据需要以任意数量的 {} 符号开始插值字符串,匹配相应数量的 $ 符号。例如:

let template = $$$"""
<div class="{{{classAttr}}}">
  <p>{{title}}</p>
  <div><img alt="item" src="https://www.infoq.com/news/2023/07/sharp-interpolation-syntax/%7B%7BitemImageUrl%7D%7D"></div>
  <button type="button" class="add" (click)="add(item)">Add</button>
</div>
"""

与 C# 的区别

尽管新功能的设计借鉴了 C# 的字符串插值,但存在一些显著差异,这些差异主要是为了保持向后兼容性,避免破坏现有代码。例如,C# 中的多行原始字符串字面量必须从新行开始,并且该新行会被自动忽略;而在 F# 中,你可以添加新行,但不会被忽略。此外,C# 中可以使用任意数量的 " 开始原始字符串字面量,而 F# 中必须使用三个 "

预览功能

需要注意的是,该功能目前仍处于预览阶段,因此需要通过 dotnet fsi--langversion:preview 参数启用,或在 .fsproj 文件的 <OtherFlags> 标签下进行配置。

阅读 36
0 条评论