Scala中的BoxedUnit和Unit有什么区别?它们什么时候用作函数的返回类型?他们与REF的关系是什么?这是我在处理Unit时遇到的类型不匹配错误.
错误:java.lang.AssertionError:断言失败:无法从单元hello.scala中的UNIT转换为REF(类BoxedUnit) - 源码//Users/shiyu/Scala/FinalDataFlow/src/print/hello.scala,line- 347,偏移量= 13999
我正在使用一个scala编译器插件,该插件f(x)用块替换函数调用
{
val newvalue = f(x)
newvalue
}
Run Code Online (Sandbox Code Playgroud)
此块的值与相同f(x)。
编译器插件在编译器阶段“ typer”之后立即工作,并通过用块的AST替换f(x)的AST进行上述转换。
在编译器阶段“ typer”之后执行此操作,新创建的块是未包含符号和类型的原始AST及其子AST。我需要调用localTyper来提供原始ASTs符号和类型。
val newVal = (ValDef(Modifiers(0), newTermName("newvalue"), TypeTree(a.tpe), a))
val newIdent = (Ident(newTermName("newvalue")))
localTyper.atOwner(parSymbol).typed(Block(List(newVal), newIdent))
Run Code Online (Sandbox Code Playgroud)
注意:a是函数调用“ f(x)” newVal的AST ,是“ ” 的AST val newvalue = f(x)。并且newIdent是newvalue该块中对“ ” 的引用。parSymbol是旧版AST的所有者的符号“ f(x)”,或a。
上面的代码在大多数情况下都能正常工作。但是,当在应用于函数“ f”的参数中有一些值的定义(无论是显式的还是隐式的)时,编译器都会发出错误。例如,我要转换:
object hello {
def f(x : Unit) = {}
def g = f {
try {
}
catch {
case t …Run Code Online (Sandbox Code Playgroud) 出于某些特殊原因,我想在大程序中删除所有@tailrec的效果,但是不想手动执行,编译时是否有任何可选参数可以关闭尾递归优化?我想在代码中留下@tailrec,但是不想检查它并在编译时进行尾递归优化.那可能吗?