有沒有人知道是否有一個內置函數從控制檯讀取printfn
函數? 迄今爲止我所見過的唯一方法是使用System.Console.Read()
,但它不像使用像printfn
這樣的結構的功能。從控制檯讀取F#
從控制檯讀取F#
回答
這確實是一個恥辱,沒有這樣的內置函數。但是,正如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"
據我所知,沒有。
這將是得心應手代碼高爾夫球:)
這是一個恥辱的'printfn'函數本身依賴於編譯器魔法 - 你不能讓你自己的F#'的sscanf 「非常好。 – 2010-03-10 11:34:54
你可以這樣做,我想。唯一的妙處是字符串文字可以被強制轉換爲PrintfFormats,此時這些類型會被顯示出來:let pf():PrintfFormat <_,_,_,_> =「%d%s」 – Brian 2010-03-10 16:11:48
組合的TryParse()和分流/正則表達式是您可以使用的「開盒即用」。
P.S.我見過http://www.codeproject.com/KB/recipes/csscanf.aspx,它的工作原理;)
- 1. 讀取從控制檯
- 2. 從控制檯讀取int
- 3. 從控制檯讀取雙精度值
- 4. 從控制檯程序讀取輸出
- 5. Python 3.2.2從控制檯讀取
- 6. 從外部程序/控制檯讀取
- 7. 如何從控制檯讀取? - Linux的
- 8. 從控制檯異步讀取。
- 9. 在Java中從控制檯讀取
- 10. 從控制檯讀取字符串
- 11. 從Lua控制檯讀取數字後,如何讀取單詞?
- 12. C從控制檯讀取限制字符輸入。怎麼做?
- 13. 從控制檯讀取二進制數字
- 14. 反斜槓讀寫和F#交互式控制檯
- 15. PHP讀取控制檯輸出
- 16. 如何讀取Xcode控制檯輸出?
- 17. 使用控制檯讀取Intellij的System.in
- 18. 從微控制器讀取
- 19. 從控制檯
- 20. 從控制檯
- 21. 從控制檯
- 22. 從控制檯
- 23. 從控制檯讀取時使輸入文本變粗體
- 24. 是否可以從Dart的控制檯讀取?
- 25. 如何從C++的Windows命令中讀取控制檯輸出?
- 26. 從Java控制檯程序的命令行中讀取段落
- 27. 從控制檯讀取已經輸入的行C++
- 28. 在某些條件下從子控制檯管道讀取
- 29. HashMap幫助,從文件打印讀取到控制檯或JTextArea
- 30. ObjectiveC - 從控制檯字符串中讀取多行(Breaks \ newLine)
當我需要更完整版本的'sscanf',擴展這段代碼非常容易。在這裏查看結果:http://fssnip.net/4I – wmeyer 2011-05-12 17:53:49
@wmeyer - 太棒了! – kvb 2011-05-12 20:00:11
@wmeyer:你有興趣爲FSharpx做出貢獻嗎? https://github.com/fsharp/fsharpx – 2011-10-31 23:24:47