将Ruby循环重构为Scala循环

时间:2013-11-07 20:00:44

标签: ruby scala

我有一些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值之间,这是理想的。

1 个答案:

答案 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 {…}