1

我有一些我正在尝试使用 Scala 重构的 Ruby 代码。我将在下面给出一个代码示例,但是 Ruby 的动态特性使得编写它变得微不足道(这也有助于我比 Scala 更精通 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 中开始了这个示例,我猜正确的答案是以某种方式 Map 或使用 Enums,但我不知道如何将它拼凑在一起,但显然这样的事情是行不通的:

 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 值之间,这将是理想的。

4

1 回答 1

1

首先,创建一个案例类来表示时间段是个好主意

case class Period(start: Date, end: Date)

所以,像这样声明常量:

val period1 = Period(d1, d2)
val period2 = Period(d3, d4)

并创建一个序列并使用 for 理解进行迭代

for (d <- Seq(period1, period2)) yield {…}
于 2013-11-07T20:09:58.073 回答