F#中的模板字符串?

Dan*_*ang 5 f#

我是F#的新手,想知道F#中是否有类似Python中的模板字符串.所以我可以简单地做一些事情:

    >>> d = dict(who='tim', what='car')
    >>> Template('$who likes $what').substitute(d)
    'tim likes car'
Run Code Online (Sandbox Code Playgroud)

N_A*_*N_A 8

在F#中这样做的惯用方法是sprintf:

let newString = sprintf "First Name: %s Last Name: %s" "John" "Doe"
Run Code Online (Sandbox Code Playgroud)

此外,您可以访问.net String.Format:

let newString = String.Format("First Name: {0} Last Name: {1}", "John", "Doe")
Run Code Online (Sandbox Code Playgroud)

第一个的好处是它是类型安全的(即你不能将字符串传递给整数格式化程序,如"%d").正如Benjol在评论中所指出的那样,传递格式字符串sprintf是不可能的,因为它是静态类型的.有关详细信息,请参见此处.

  • 第二个的好处是你可以*传递一个字符串变量作为格式字符串:) (3认同)

sdg*_*sdh 5

F# 5 中的新功能是字符串插值

let firstName = "John" 
let lastName = "Doe" 

let newString = $"First Name: {firstName} Last Name: {lastName}" 
Run Code Online (Sandbox Code Playgroud)

或者没有本地绑定(注意三引号):

let newString = $"""First Name: {"John"} Last Name: {"Doe"}"""
Run Code Online (Sandbox Code Playgroud)

旧版本的 F# 应该使用sprintf

let newString = sprintf "First Name: %s Last Name: %s" "John" "Doe"
Run Code Online (Sandbox Code Playgroud)


Sco*_*ott 2

我不知道核心库中有任何内置的东西可以以您正在寻找的键值方式工作,但是您可以使用sprintf函数进行类型检查的格式化字符串:

let intro = sprintf "I am %d years old. My name is %s" 35 "Sam"
Run Code Online (Sandbox Code Playgroud)