gpt4 book ai didi

scala - 从键盘读取日期直到它正确 - 在 Scala 中

转载 作者:行者123 更新时间:2023-12-02 05:17:51 24 4
gpt4 key购买 nike

我想不断提示用户以给定的格式输入日期,直到他/她输入正确为止。

这是我所做的:

def readDate(prompt: String): Date = {
var date: Option[Date] = None
Iterator.continually {
val startDateString = readLine(prompt)
val startDate = catching(classOf[ParseException]).opt(asDate(startDateString))
date = startDate
startDate
}.takeWhile(_ == None).foreach {
date =>
println("Incorrect format. Try again.")
}
date.get
}

asDate 只是对输入的字符串使用 SimpleDateFormat.parse

现在,这似乎可行,但我很确定这不是正确的方法。

我真的不明白如何处理这些链式迭代器(因为 Iterator.continually 和 takeWhile 都返回一个 AbstractIterator 的实例)。

我基本上有两个问题:

1) 有没有办法从Iterator.continually“返回”startDate?我已经尝试并失败了 map-ping 它。我想要这样做是为了摆脱 var datedate = startDate

2) 如果我不想在读取之间发生任何事情,我将如何处理最后一个 foreach?我已经看到如果我只是删除它没有任何效果(我认为是因为 next() 没有被调用),但是可以像这样把它留在那里吗:

takeWhile(_ == None).foreach { date => {}} ?

有没有比“空”foreach 更好的方法?

谢谢!

最佳答案

您应该使用 find 而不是 takeWhile -- 这将不断丢弃条目,直到一个好的条目通过。然后你有一个Option,所以你只需要

def readDate(prompt: String): Date = {
Iterator.continually {
catching(classOf[ParseException]).opt(asDate( readLine(prompt) ))
}.find(_.isDefined).get
}

如果你不想打印任何东西。如果你确实想打印一些东西,你可以把它放到循环中。

def readDate(prompt: String): Date = {
Iterator.continually {
catching(classOf[ParseException]).opt(asDate( readLine(prompt) )) match {
case None =>
println("Incorrect format. Try again.")
None
case x => x
}
}.find(_.isDefined).get
}

我不确定这是否更清晰,但它肯定更短并且可以完成您想要的事情。

我可能会改用尾递归函数:

import annotation.tailrec
@tailrec def readDate(prompt: String, again: Boolean = false): Date = {
if (again) println("Incorrect format. Try again.")
catching(classOf[ParseException]).opt(asDate( readLine(prompt) )) match {
case Some(date) => date
case None => readDate(prompt, true)
}
}

这里的逻辑对我来说似乎更清晰一些。

关于scala - 从键盘读取日期直到它正确 - 在 Scala 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14348841/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com