我是F#的新手,想知道F#中是否有类似于template strings in Python的内容。所以我可以简单地做一些事情:
>>> d = dict(who='tim', what='car')
>>> Template('$who likes $what').substitute(d)
'tim likes car'
答案 0 :(得分:7)
在F#中执行此操作的惯用方法是使用sprintf
:
let newString = sprintf "First Name: %s Last Name: %s" "John" "Doe"
此外,您还可以访问.net String.Format
:
let newString = String.Format("First Name: {0} Last Name: {1}", "John", "Doe")
第一个的好处是它是类型安全的(即你不能将字符串传递给像“%d”这样的整数格式化程序)。正如Benjol在评论中所指出的那样,不可能将格式字符串传递给sprintf
,因为它是静态类型的。有关详细信息,请参阅here。
答案 1 :(得分:4)
F# 5 中的新功能是 string interpolation:
let firstName = "John"
let lastName = "Doe"
let newString = $"First Name: {firstName} Last Name: {lastName}"
或者没有本地绑定(注意三引号):
let newString = $"""First Name: {"John"} Last Name: {"Doe"}"""
旧版本的 F# 应该使用 sprintf
:
let newString = sprintf "First Name: %s Last Name: %s" "John" "Doe"
答案 2 :(得分:1)
我不知道核心库中内置任何可以按照您正在寻找的键值方式工作的内容,但您可以使用 {{3进行类型检查的格式化字符串功能:
let intro = sprintf "I am %d years old. My name is %s" 35 "Sam"
答案 3 :(得分:0)
如果你有一个动态的替换列表,你可以通过一个简单的折叠来实现 Template() 所做的:
let substitutions = [("who", "tim"); ("what", "car")]
let template = "{who} likes {what}"
let replace (str : string) (key, value) = str.Replace(sprintf "{%s}" key, value)
List.fold replace template substitutions