Scala'da getiri kullanarak geri dönen ve yinelenen koleksiyon

I have a DateTime and TimeSpan class in Scala (assume that the < and + operators work as they should). I'm trying to define a 'range' function that takes a start/stop time and a timespan for stepping. In C# I would do this with a yield, and I think I should be able to do the same in Scala... except I'm getting a strange error.

'Verim t' çizgisinde, "Yasadışı ifadenin başlangıcı" alırım.

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

Bu koda baktığımda, 2 şey hakkında merak ediyorum: 1) neyi yanlış yaptım? 2) Yazılan kod çok zorlayıcıdır (var t, vb. Kullanır). Scala'da bunu oldukça hızlı yapan daha işlevsel yol nedir?

Teşekkürler!

5
Scala'da verim , C# (veya Python) 'da verim ile hiçbir ilgisi yoktur. Dahası, Scala'nın buna eşdeğer değil - Scala, Python, verim ve jeneratörler hakkındaki birçok soruyu araştırın. Ve elbette, verim 'in gerçekte ne yaptığıyla ilgili sorulara bakın.
katma yazar Daniel C. Sobral, kaynak
Ben yaptım ve kafam karıştı. Debilski'nin cevabı, bilmem gereken her şeyi anlattı.
katma yazar fbl, kaynak

3 cevap

def dateRange(from : DateTime, to : DateTime, step : TimeSpan): Iterator[DateTime] =
  Iterator.iterate(from)(_ + step).takeWhile(_ <= to)
17
katma
Sana bir +1000 verebilirsem, yapardım. Bu harika.
katma yazar fbl, kaynak

İşte joda zaman periyotları ile @Debilski çözümü bir sürümü:

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

def dateRange(from: DateTime, to: DateTime, step: Period): Iterator[DateTime] =
  Iterator.iterate(from)(_.plus(step)).takeWhile(!_.isAfter(to))
3
katma

Scala'da verim for-döngüler için özel bir ifadedir.

Ben C# bilmiyorum, ama anladığım kadarıyla, sizin için en kolay olduğunu düşünüyorum collection.immutable.NumericRange.Exclusive [DateTime] veya collection.immutable.NumericRange.Inclusive Aralığınızın özel veya kapsayıcı olmasına bağlı olarak [DateTime] .

Bunun çalışması için DateTime türündeki aritmetiği tanımlayan Integral [DateTime] örneğini oluşturmanız gerekir.

0
katma
Integral , DateTime için uygulanacak aptalca bir şeydir. Iterator.iterate ile diğer yaklaşım çok daha iyi.
katma yazar 0__, kaynak