Возвращаемая и повторяемая коллекция с использованием yield в scala - PullRequest
5 голосов
/ 28 октября 2011

У меня есть классы DateTime и TimeSpan в Scala (предположим, что операторы <и + работают так, как должны). Я пытаюсь определить функцию «диапазон», которая занимает время запуска / остановки и промежуток времени для перехода. В C # я сделал бы это с выходом, и я думаю, что смогу сделать то же самое в Scala ... за исключением того, что я получаю странную ошибку. </p>

В строке 'yield t' отображается «Неверное начало утверждения».

  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
    }
  }

Глядя на этот код, мне интересно узнать 2 вещи: 1) что я сделал не так? 2) написанный код очень важен (использует var t и т. Д.). Какой более функциональный способ сделать это в Scala достаточно быстрый?

Спасибо!

Ответы [ 3 ]

17 голосов
/ 28 октября 2011
def dateRange(from : DateTime, to : DateTime, step : TimeSpan): Iterator[DateTime] =
  Iterator.iterate(from)(_ + step).takeWhile(_ <= to)
3 голосов
/ 05 марта 2013

Вот версия решения @Debilski с периодами времени joda:

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

def dateRange(from: DateTime, to: DateTime, step: Period): Iterator[DateTime] =
  Iterator.iterate(from)(_.plus(step)).takeWhile(!_.isAfter(to))
0 голосов
/ 28 октября 2011

В Scala yield - это специальный оператор для циклов for.

Я не знаю C #, но из того, что я понимаю, я думаю, что вам проще всего использовать collection.immutable.NumericRange.Exclusive[DateTime] или collection.immutable.NumericRange.Inclusive[DateTime], в зависимости от того, является ли ваш интервал эксклюзивным или включающим.

Чтобы это работало, вам нужно создать экземпляр Integral[DateTime], который определяет арифметику для типа DateTime.

...