2

ユーザーが正しく理解できるまで、特定の形式で日付を入力するようにユーザーに継続的に促したいと思います。

これは私がやったことです:

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.continuouslyとtakeWhileの両方がAbstractIteratorのインスタンスを返すため)。

基本的に2つの質問があります。

startDate1)から「戻る」方法はありIterator.continuallyますか?私はそれをmappingしようとして失敗しました。var dateとを取り除くためにこれが欲しいですdate = startDate

2)読み取​​りの間に何も起こらないようにするには、最後のforeachをどうしますか?削除しただけでは何も機能しないことを確認しましたが(next()が呼び出されていないためだと思います)、次のようにそのままにしておいてもかまいません。

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

「空の」foreachよりも良い方法はありますか?

ありがとう!

4

2 に答える 2

3

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)
  }
}

ここでは、ロジックが少し明確に見えます。

于 2013-01-15T23:53:48.843 に答える
2

私はそれを次のように書きます

def readDate(prompt: String): Date = 
  try asDate(readLine(prompt))
  catch { case e: ParseException => 
    println("Incorrect format. Try again.")
    readDate(prompt)
  }
于 2013-01-16T11:10:01.403 に答える