有没有人知道是否有一个内置函数可以从控制台读取同样的printfn
函数?
到目前为止,我见过的唯一方法是使用System.Console.Read()
,但它不像使用像printfn
这样的构造那样有用。
答案 0 :(得分:17)
没有这样的内置功能确实令人遗憾。但是,正如Brian在评论Benjol的回答中提到的那样,可以自己构建一个scanf
函数。以下是如何定义sscanf
变体的快速草图,尽管只实现了%s
个占位符:
open System
open System.Text
open System.Text.RegularExpressions
open Microsoft.FSharp.Reflection
let sscanf (pf:PrintfFormat<_,_,_,_,'t>) s : 't =
let formatStr = pf.Value
let constants = formatStr.Split([|"%s"|], StringSplitOptions.None)
let regex = Regex("^" + String.Join("(.*?)", constants |> Array.map Regex.Escape) + "$")
let matches =
regex.Match(s).Groups
|> Seq.cast<Group>
|> Seq.skip 1
|> Seq.map (fun g -> g.Value |> box)
FSharpValue.MakeTuple(matches |> Seq.toArray, typeof<'t>) :?> 't
let (a,b) = sscanf "(%s, %s)" "(A, B)"
let (x,y,z) = sscanf "%s-%s-%s" "test-this-string"
答案 1 :(得分:1)
据我所知,没有。
对于代码高尔夫来说会很方便:)
答案 2 :(得分:1)
TryParse()和split / regex的组合就是你可以“开箱即用”的。
P.S。我见过http://www.codeproject.com/KB/recipes/csscanf.aspx并且它有效;)