In 2.8 gibt es eine geschützte Methode namens tailDefined
, die false zurückgibt, wenn Sie an den Punkt im Stream gelangen, der noch nicht ausgewertet wurde.
Dies ist nicht sehr nützlich (es sei denn, Sie möchten Ihre eigene Stream
Klasse schreiben), außer dass Cons
selbst die Methode veröffentlicht. Ich bin nicht sicher, warum es in Stream und nicht in Cons geschützt ist - ich würde denken, dass der eine oder der andere ein Bug sein könnte. Aber jetzt, zumindest, können Sie eine Methode, wie so schreiben (ein funktionales Äquivalent Schreiben wird dem Leser als Übung):
def streamEvalLen[T](s: Stream[T]) = {
if (s.isEmpty) 0
else {
var i = 1
var t = s
while (t match {
case c: Stream.Cons[_] => c.tailDefined
case _ => false
}) {
i += 1
t = t.tail
}
i
}
}
Hier können Sie es in Aktion sehen:
scala> val s = Stream.iterate(0)(_+1)
s: scala.collection.immutable.Stream[Int] = Stream(0, ?)
scala> streamEvalLen(s)
res0: Int = 1
scala> s.take(3).toList
res1: List[Int] = List(0, 1, 2)
scala> s
res2: scala.collection.immutable.Stream[Int] = Stream(0, 1, 2, ?)
scala> streamEvalLen(s)
res3: Int = 3
Die Methode 'tailDefined' ist sowohl in' Cons' als auch 'Empty' öffentlich und ich glaube nicht, dass es ein Fehler ist. Das habe ich vorher nicht bemerkt. Ich kann Ihre Lösung anpassen, um mein Problem zu lösen. –