【问题标题】:F# How do a create a loop in a console app that loops through a method until a certain key is hitF#如何在控制台应用程序中创建一个循环,该循环循环一个方法直到某个键被击中
【发布时间】:2013-08-01 19:01:35
【问题描述】:

我有一个 C# 控制台应用程序,它有一个看起来像这样的无限循环方法

while (true) 
{
    Event eventObj = session.NextEvent();               
    foreach (Message msg in eventObj)   
    {
        System.Console.WriteLine(msg.ToString());
    }
}

我曾尝试以这种方式将其移植到 F#,添加在按下“Q”键时退出循环的功能。

member private this.SynchronousRespsonse =
    let rec checkResponse = 
        let c = System.Console.ReadKey()
        if c.Key = System.ConsoleKey.Q then
                 this.unsubscibe
        else  
            let eventObj : Event = session.NextEvent()
            for msg in eventObj do
                printfn "%A" msg.ToString
     checkResponse

但它不起作用。 控制台输出为:

checking...
<fun:checkResonse@41-1>
Unsubscribing ...

如何编写循环来完成与 C# 相同的操作,同时添加一种方便的方式来退出循环?

编辑: 我正在寻找一种方法让它循环检查新事件,但如果按下“Q”键则停止。我不希望它在再次循环之前等待一个键。所以System.Console.ReadKey() 可能不是正确的选择。

【问题讨论】:

    标签: f# c#-to-f#


    【解决方案1】:

    您需要实际定义函数而不仅仅是变量 - 您想要类似的东西

    member private this.SynchronousRespsonse() =
            let c = System.Console.ReadKey()
            if c.Key = System.ConsoleKey.Q then
                     this.unsubscibe
            else  
                let eventObj : Event = session.NextEvent()
                for msg in eventObj do
                    printfn "%A" msg.ToString
                this.SynchronusResponse()
    

    另外,额外的rec 绑定不是必需的,您希望递归仅发生在else 块中,以便您可以在按下Q 后返回

    【讨论】:

    • 刚刚试了一下。它正在工作,但它仍然会停止并在再次循环之前等待每个控制台键。我希望让它循环直到按键被按下但不等待它。我使用Console.Readkey 似乎不是正确的选择。我会寻找更好的方法
    • System.Console.KeyAvailable 也许是一个替代方案
    【解决方案2】:

    感谢 John Palmer 的解决方案,函数的递归/循环部分完全按照我的意愿执行。为了获得我想要的确切的循环停止行为(除非按下“Q”键,否则总是循环)需要更多的按摩。这是最终的解决方案

    member private this.SynchronousRespsonse =
        let eventObj : Event = session.NextEvent()
        for msg in eventObj do                    
            // to some stuff here  
        if Console.KeyAvailable && Console.ReadKey().Key = ConsoleKey.Q then
            this.unsubscibe
        else
            this.SynchronousRespsonse
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-10-12
      • 1970-01-01
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      相关资源
      最近更新 更多