Scala中重载ff函数触发StackOverflowError问题排查求助
问题分析与修复方案
兄弟,你这栈溢出的问题根源太明显了——无限递归搞的鬼!
咱们直接看你写的第二个ff函数:
def ff(p: Char => Boolean): Boolean = { ff(p) }
你重载了ff方法,这个版本接受一个Char => Boolean类型的谓词参数,但函数体里直接写ff(p),这相当于它在不停地调用自己,完全没和第一个查找单个字符的ff函数产生关联。每次调用这个谓词版本的ff,都会触发新一轮的自我调用,栈帧一层叠一层,最终直接把栈撑爆,自然就出现栈溢出错误了。
结合你的设计意图(从cursor位置开始查找满足条件的字符),这个谓词版本的ff得重新实现遍历逻辑,而不是瞎递归。修正后的代码应该是这样的:
def ff(c: Char): Boolean = { while (cursor <= end) { if (buffer.charAt(cursor) == c) { return true } else { cursor += 1 } } false } // 修正后的谓词版本ff def ff(p: Char => Boolean): Boolean = { while (cursor <= end) { val currentChar = buffer.charAt(cursor) if (p(currentChar)) { return true } else { cursor += 1 } } false }
这样两个ff函数各自实现对应的查找逻辑:第一个找指定字符,第二个找满足谓词条件的字符,不会再出现无限递归的问题,cursor也能按照你的预期正常移动啦。
内容的提问来源于stack exchange,提问作者Mike Noel Higgs
相关产品推荐
相关产品推荐

