Scala 为什么在这个宏中类型相等失败,但类型一致性成功?
我试图确定在编译时传递到宏中的参数的类型。当我使用Scala 为什么在这个宏中类型相等失败,但类型一致性成功?,scala,macros,scala-macros,Scala,Macros,Scala Macros,我试图确定在编译时传递到宏中的参数的类型。当我使用时,它似乎起作用,这是因为“Hi”的类型不仅仅是字符串,它是更具体的类型-字符串(“Hi”),这意味着该类型包含表示具体字符串文字的信息 同样的情况也发生在literal1——它的类型是Int(1),而不仅仅是Int 您可以使用类型上的加宽方法来去除有关常量值的信息: object Macros { def say(param: Any): Unit = macro impl def impl(c: Context)(param: c.
时,它似乎起作用,这是因为“Hi”
的类型不仅仅是字符串,它是更具体的类型-字符串(“Hi”)
,这意味着该类型包含表示具体字符串文字的信息
同样的情况也发生在literal1
——它的类型是Int(1)
,而不仅仅是Int
您可以使用类型
上的加宽
方法来去除有关常量值的信息:
object Macros {
def say(param: Any): Unit = macro impl
def impl(c: Context)(param: c.Expr[Any]): c.Expr[Unit] = {
if (param.actualType.widen.=:=(c.universe.typeOf[String])) {
c.universe.reify { printf("string: %s\n", param.splice) }
} else if (param.actualType.widen.=:=(c.universe.typeOf[Int])) {
c.universe.reify { printf("int: %d\n", param.splice) }
} else {
c.universe.reify { printf("any: %s\n", param.splice) }
}
}
}
+比我快。值得注意的是,Int(1)
被称为单例类型,即仅由值1
占据的类型,=:=
将与非文字参数(例如val i=1;宏。比如(i)
)一样工作。非常棒。谢谢你们两位!
object Test extends App {
Macros.say("Hi")
Macros.say(1)
Macros.say(Blah)
}
case object Blah
string: Hi
int: 1
any: Blah
any: Hi
any: 1
any: Blah
object Macros {
def say(param: Any): Unit = macro impl
def impl(c: Context)(param: c.Expr[Any]): c.Expr[Unit] = {
if (param.actualType.widen.=:=(c.universe.typeOf[String])) {
c.universe.reify { printf("string: %s\n", param.splice) }
} else if (param.actualType.widen.=:=(c.universe.typeOf[Int])) {
c.universe.reify { printf("int: %d\n", param.splice) }
} else {
c.universe.reify { printf("any: %s\n", param.splice) }
}
}
}