在宏内部,如何让编译器推断构造树的类型? 我只找到Context.typeCheck,但只检查类型但不返回结果。在scala宏中推断树的类型
4
A
回答
7
如果你类型检查的树,你可以只使用其tpe
方法:
scala> def impl(c: Context) = c.literal(c.typeCheck(c parse "1+1").tpe.toString)
impl: (c: scala.reflect.macros.Context)c.Expr[String]
scala> def mac = macro impl
mac: String
scala> println(mac)
Int(2)
您可以也把它包在一个表达式,当然,但有没有必要,如果你只是想要的类型。
2
我想通了,我希望这样可以节省别人的麻烦
import reflect.macros.Context
import language.experimental.macros
def impl(c: Context) = {
val tree = c.parse("1+1")
val expr = c.Expr[Any](c.typeCheck(tree))
println(expr.staticType)
println(expr.actualType)
c.literalUnit
}
def mac = macro impl
通过包装成Expr的你要查询的实际类型的能力。任何地方都可以提供合法的上限。如果没有这种感染类型将是Expr [Nothing],那么您将遇到麻烦。问题是要包装从c.typeCheck返回的树,否则Type只是null。
方法mac
只是返回()它打印出Any
上限和Int(2)
-实际的类型。
相关问题
- 1. Scala类型推断失败?
- 2. Scala类型推断限制
- 3. Scala推断的类型参数 - 类型范围推断为'Nothing'
- 4. scala中推断的参数类型
- 5. Java中的Scala元组类型推断
- 6. scala中的参数类型推断
- 7. Scala方法推断的泛型类型
- 8. 与_占位Scala的类型推断
- 9. Scala的类型推断问题
- 10. Scala中的嵌套类型的类型推断
- 11. Scala的类型推断未能推断类型的通用功能
- 12. Scala的类型推断:不能推断IndexedSeq [T]从Array [T]
- 13. Scala字符串与java.lang.String - 类型推断
- 14. scala隐式参数类型推断
- 15. scala宏如何推断隐含CanBuildFrom
- 16. 在Scala中和Then()中的类型推断
- 17. 在Scala中泛型类型的函数成员参数类型的推断?
- 18. 在Scala中推断正确类型的lambda表达式
- 19. 匹配Scala宏中的泛型类型
- 20. 与函数类型Scala的类型推断
- 21. 类型构造器的Scala类型推断
- 22. 理解Scala的类型推断和extensial类型
- 23. 在Intellij Scala插件中显示推断类型
- 24. SML中的类型推断
- 25. Scala宏和类型擦除
- 26. 推断类型泛型类
- 27. 多态函数中的Scala自动类型推断
- 28. Scala中`def`和`val`的不同类型推断
- 29. 是否可以改进Scala中部分应用类型的类型推断?
- 30. F#类型推断