5

我在 Scala 中有一个 DateTime 和 TimeSpan 类(假设 < 和 + 运算符正常工作)。我正在尝试定义一个“范围”函数,该函数需要开始/停止时间和步进时间跨度。在 C# 中,我会用产量来做这件事,我想我应该能够在 Scala 中做同样的事情......除了我遇到了一个奇怪的错误。

在 'yield t' 行,我得到“Illegal start of statement”。

  def dateRange(from : DateTime, to : DateTime, step : TimeSpan) =
  {
      // not sure what the list'y way of doing this is
    var t = from

    while(t < to)
    {
      yield t; // error: illegal start of statement
      t = t + step
    }
  }

看着这段代码,我很好奇两件事:1)我做错了什么?2) 编写的代码非常必要(使用 var t 等)。在 Scala 中执行此操作的更实用的方法是什么?

谢谢!

4

3 回答 3

17
def dateRange(from : DateTime, to : DateTime, step : TimeSpan): Iterator[DateTime] =
  Iterator.iterate(from)(_ + step).takeWhile(_ <= to)
于 2011-10-28T13:11:41.190 回答
3

这是带有joda时间段的@Debilski解决方案版本:

import org.joda.time.{DateTime, Period}

def dateRange(from: DateTime, to: DateTime, step: Period): Iterator[DateTime] =
  Iterator.iterate(from)(_.plus(step)).takeWhile(!_.isAfter(to))
于 2013-03-05T13:28:24.103 回答
0

在 Scala 中,yield是 for 循环的特殊语句。

我不知道 C#,但据我了解,我认为对你来说最简单的是使用collection.immutable.NumericRange.Exclusive[DateTime]or collection.immutable.NumericRange.Inclusive[DateTime],这取决于你的区间是独占的还是包含的。

为此,您需要创建一个实例,Integral[DateTime]该实例定义了 type 的算法DateTime

于 2011-10-28T13:10:16.543 回答