2

想办法从 2 小时中减去 5 分钟。

从 2 中减去 5 是没有意义的,因为我们最终会得到 -3 通用时间单位,这是没有用的。但如果“小时”是“分钟”的子类型,我们可以将 2 小时转换为 120 分钟,得到 115 分钟或 1 小时 55 分钟。

同样,如果我们想将 5 个苹果加到 5 个橙子中,我们不能用苹果来评估它,但可能会得到 10 个水果。

在上面的例子中,通常当使用数字作为形容词时,整数需要通过它们描述的对象类型来参数化。我认为如果不是声明,那将非常有用

val hours = 2
val minutes = 5

你可以做类似的事情

val hours = 2[Hour]
val minutes = 5[Minute]
val result = hours - minutes
assert (result == 115[Minute])

是否存在这样的事情,是否有用,是否可以实施?

编辑:澄清一下,上面的时间示例只是我想到的一个随机示例。我的问题更多的是参数化数值的概念是否是一个有用的概念,就像你有参数化列表等一样。(答案可能是“不”,我不知道!)

4

4 回答 4

6

您可以通过为 Hours 和 Minutes 设置两个类以及从小时到分钟的隐式转换函数来完成此操作

trait TimeUnit
case class Hour(val num: Int) extends TimeUnit      
case class Minute(val num: Int) extends TimeUnit {
  def - (sub: Minute) = Minute(num - sub.num)
}

implicit def hour2Minute(hour: Hour) = Minute(hour.num * 60)

这使您可以执行类似的操作

val h = Hour(2) - Minute(30) //returns Minute(90)
于 2011-07-07T15:37:00.263 回答
3

您可以在 lift 框架 ( spec ) 中找到一些示例。

import net.liftweb.utils.TimeHelpers._
3.minutes == 6 * 30.seconds

(注意:您似乎需要有合理的数字才能正确比较。例如,可能不超过 60 秒。)

于 2011-07-07T15:31:09.637 回答
2

您可以尝试scala-time ,它是Joda Time的一个包装器,它使 Scala 更加地道,包括一些 DSL 来进行时间段计算,类似于 Brian Agnew 在他的回答中所建议的。

例如,

2.hours + 45.minutes + 10.seconds

创建一个 Joda Period

于 2011-07-07T21:58:32.340 回答
1

在我看来,DSL 在这里很有用。所以你可以写

2.hours - 5.minutes

并且将进行适当的转换以将 2 hours 转换为 Hours 对象(值 2)等。

存在大量描述 Scala 的 DSL 功能的资源。例如从 O'Reilly 看到这个

于 2011-07-07T15:31:47.643 回答