@ジャックはかなり良い答えを提案しました。
これは、必要に応じていくつかの構成を有効にするために役立つ可能性のある彼のコードのバージョンです(check
関数は構成されていませんが、構成に簡単に変更して、値以降の詳細を表示できます)
package object pimps {
import java.util.Date
import org.joda.time.DateTime;
import org.joda.time.Period;
def step(f:Period => Int)(fi:String):Period => Option[String] = {
def g(i:Int = 1) = i + " " + fi + (if (i==1) "" else "s") + " ago"
(p:Period) => {
f(p) match {
case 0 => None
case 1 => Some(g())
case x => Some(g(x))
}
}
}
val yearsStep = step(_.getYears)("year")
val monthsStep = step(_.getMonths)("month")
val daysStep = step(_.getDays)("day")
val hoursStep = step(_.getHours)("hour")
val minutesStep = step(_.getMinutes)("minute")
val secondsStep = step(_.getSeconds)("second")
val steps = Seq(yearsStep, monthsStep, daysStep, hoursStep, minutesStep, secondsStep)
val check =
(p:Period) =>
steps.collectFirst {
case f if f(p).isDefined => f(p).get
}
implicit class PimpedDate(col: Date) {
def since() = {
val period: Period = new Period(new DateTime(col), DateTime.now);
check(period)
}
}
}
ご覧のとおり、今のところ、最初の一致レベルで停止し、ゲッターを繰り返します(一致が2回呼び出される場合はgetYears)。
それにもかかわらず、注意すべきもう1つの点はimplicit class
、ポン引きを容易にするためにScala2.10で使用法が導入されていることです。