我有一些Ruby代码,我试图使用Scala重构。我将在下面给出一个代码示例,但Ruby的动态特性使得编写这一点很简单(也有助于我比Ruby更精通Ruby)。这是Ruby中的代码:
我有一堆常量定义如下
REG_WEEK_1_START = Date.parse('2013-09-05')
REG_WEEK_1_END = Date.parse('2013-09-09')
REG_WEEK_2_START = Date.parse('2013-09-12')
REG_WEEK_2_END = Date.parse('2013-09-16')
REG_WEEK_3_START = Date.parse('2013-09-19')
REG_WEEK_3_END = Date.parse('2013-09-23')
然后,为了弄清楚我是否在某个星期(并且你不能在这里使用连续功能,因为在现实世界的例子中,周数可以是1到7天之后的任何地方),使用这个简单的循环:
def get_week
date = Date.now
for i in 1..17
return i if date >= const_get("REG_WEEK_#{i}_START") && date <= const_get("REG_WEEK_#{i}_END")
end
return 0
end
在Ruby中执行此操作证明是微不足道的,因为您可以使用const_get
方法动态调用名称的常量。现在,我在Scala中开始这个例子,我猜测正确的答案是以某种方式映射或使用枚举,但我不确定如何将它拼凑在一起,但显然这样的东西不起作用:
def getCurrentWeek: Int = {
val REG_WEEK_1_START = MyDateTimeHelper.parseDate("20130905")
val REG_WEEK_1_END = MyDateTimeHelper.parseDate("20130909")
val REG_WEEK_2_START = MyDateTimeHelper.parseDate("20130912")
val REG_WEEK_2_END = MyDateTimeHelper.parseDate("20130916")
.... more DATES ...
}
如何在这里循环是我陷入Scala的地方。或者如果我在这里甚至应该循环,因为我不熟悉Scala数据结构,所以可能有更优化的方法来解决这个问题。任何具有更多Scala经验的人都有一个解决方案,可以确定当前日期是否介于每个START和END值之间,这是理想的。
答案 0 :(得分:1)
首先,创建一个表示时间段的案例类是个好主意
case class Period(start: Date, end: Date)
所以,声明这样的常量:
val period1 = Period(d1, d2)
val period2 = Period(d3, d4)
创建一个序列并用for comprehension迭代
for (d <- Seq(period1, period2)) yield {…}