2.8 में, tailDefined
नामक एक संरक्षित विधि है जो स्ट्रीम में उस बिंदु तक पहुंचने पर झूठी वापसी करेगी जिसका मूल्यांकन अभी तक नहीं किया गया है।
यह बहुत उपयोगी नहीं है (जब तक कि आप अपना खुद का Stream
वर्ग नहीं लिखना चाहते हैं) सिवाय इसके कि Cons
स्वयं विधि को सार्वजनिक बनाता है। मुझे यकीन नहीं है कि यह स्ट्रीम में क्यों संरक्षित है और विपक्ष में नहीं - मुझे लगता है कि एक या दूसरा एक बग हो सकता है। लेकिन अब के लिए, कम से कम, आप लिख सकते हैं तो तरह एक विधि (एक कार्यात्मक समकक्ष लेखन पाठक के लिए एक व्यायाम के रूप में छोड़ दिया जाता है):
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
}
}
यहाँ आप कार्रवाई में इसे देख सकते हैं:
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
स्रोत
2010-05-14 15:51:44
विधि 'पूंछ परिभाषित' दोनों 'विपक्ष' और 'खाली' दोनों में सार्वजनिक है इसलिए मुझे नहीं लगता कि यह एक बग है। मैंने पहले यह नहीं देखा था। मैं अपनी समस्या को हल करने के लिए अपने समाधान को अनुकूलित कर सकता हूं। –