我有一个包含一些令牌的字符串,如下所示:
"There are two things to be replaced. {Thing1} and {Thing2}"
Run Code Online (Sandbox Code Playgroud)
我想用不同的值替换每个标记,因此最终结果如下所示:
"There are two things to be replaced. Don and Jon"
Run Code Online (Sandbox Code Playgroud)
我创建了一个链接String.Replace的函数
let doReplacement (message:string) (thing1:string) (thing2:string) =
message.Replace("{Thing1}", thing1).Replace("{Thing2}", thing2)
Run Code Online (Sandbox Code Playgroud)
问题是当我链接.Replace时,值必须保持在同一行.这样做不起作用:
let doReplacement (message:string) (thing1:string) (thing2:string) =
message
.Replace("{Thing1}", thing1)
.Replace("{Thing2}", thing2)
Run Code Online (Sandbox Code Playgroud)
为了让我做一个多线链,我想到这样的事情:
message
|> replaceString "{Thing1}" thing1
|> replaceString "{Thing2}" thing2
Run Code Online (Sandbox Code Playgroud)
有这样的支持功能:
let replaceString (message:string) (oldValue:string) (newValue:string) =
message.Replace(oldValue, newValue)
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.有没有其他方法来处理这个问题?
如果你缩进方法调用它会编译:
let doReplacement (message:string) (thing1:string) (thing2:string) =
message
.Replace("{Thing1}", thing1)
.Replace("{Thing2}", thing2)
Run Code Online (Sandbox Code Playgroud)
这是我在C#中经常看到的一种风格,对我来说似乎很合乎逻辑.
小智 6
通过使用|>管道值发送到最右边的未绑定参数(通过管道|>传送给thing2的值).通过反转参数的顺序,它按预期工作.
let replaceString (oldValue:string) (newValue:string) (message:string) =
message.Replace(oldValue, newValue)
let message = "There are two things to be replaced. {Thing1} and {Thing2}"
let thing1 = "Don"
let thing2 = "Jon"
message
|> replaceString "{Thing1}" thing1
|> replaceString "{Thing2}" thing2
|> printfn "%s"
Run Code Online (Sandbox Code Playgroud)