以下代码段
import util.control.TailCalls._
for {(num, ch) <- done((3, '3'))
} yield num
无法编译并显示错误消息:
value withFilter不是util.control.TailCalls.TailRec [(Int,Char)]
的成员
我正在使用Scala 2.12.7。如何避免这个错误? (带有Scala插件v2018.3.4的IntelliJ Idea 18.3.1没有显示错误。)
答案 0 :(得分:1)
为避免调用withFilter
并保持当前语法,如果使用编译器插件来不同地处理理解,则将很有帮助。一个选项正在使用better-monadic-for。
将此内容添加到build.sbt文件中后,即可编译问题中的代码:
addCompilerPlugin("com.olegpy" %% "better-monadic-for" % "0.3.0-M4")
(尽管它也具有其他通常具有积极作用的效果,请查阅其文档。)
答案 1 :(得分:0)
看似在代码中没有过滤,但是实际上Scala中用于理解的模式匹配(在<-
之前)被转换为对withFilter
的调用。 TailCalls
不支持withFilter
,因此无法编译。但是,以下重写会编译:
import util.control.TailCalls._
done((3, '3')).map{ case (num, ch) => num}
答案 2 :(得分:0)
另一种选择是使用扩展方法实现timespanbutton3
,例如这样(并在使用站点的范围内):
withFilter