gpt4 book ai didi

Scala bufferedIterator 在内部函数中增加头部

转载 作者:行者123 更新时间:2023-12-01 10:21:12 27 4
gpt4 key购买 nike

您好,我看到了我认为在 Scala 中的奇怪行为。在 bufferedIterator 上调用 head 似乎是在内部函数中递增 head 。要么我的 expetations 是错误的,在这种情况下为什么输出是正确的。还是输出错误?

给出:

import scala.io.Source

val source = Source.fromString("abcdef")

val buff1 = source.buffered;

println("outer head 1: " +buff1.head)
println("outer head 2: " +buff1.head)

def readLine():List[String] = {
def buffered = source.buffered
def readLine(tokens:List[String] , partialToken:String):List[String] = {
println("head1 " + buffered.head)
println("head2 " + buffered.head)
return Nil;
}
return (readLine(Nil, ""));
}

readLine();

这对我来说的预期输出是

outer head 1: a
outer head 2: a
head1: a
head2: a

实际输出如下。

outer head 1: a
outer head 2: a
head1 b
head2 c

最佳答案

scala.io.Source 的行为类似于 Iterator[Char]。因此,您必须确保不要同时在多个地方使用它:Iterator.next 在您的示例中从 3 个不同的 BufferedSource 调用了 3 次,因此您获得了不同的值从中:

  1. buff1.head:缓冲的源还没有缓冲任何东西,所以在这里请求 head 调用内部源的 next,因此第一个 a.
  2. buff1.head 再次:这里头部已经被缓冲,所以你得到 a 并且内部源没有改变。
  3. buffered.head:因为 buffered 是一个 def,这等同于 source.buffered.head .这个新的缓冲源还没有缓冲任何东西,所以请求 head 从内部源中检索一个元素,因此是 b
  4. buffered.head:这会创建另一个缓冲源,与上面相同,您会得到 c

底线是:如果调用source.buffered,永远不要直接再次使用source,也不要多次调用它 .

您的示例可以通过立即调用 buffered 来修复:

val source = Source.fromString("abcdef").buffered

您还可以将 def buffered = 转换为 val buffered = 以确保 source.buffered 不会被多次调用。

关于Scala bufferedIterator 在内部函数中增加头部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17012067/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com