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”)
,这意味着该类型包含表示具体字符串文字的信息

同样的情况也发生在literal
1
——它的类型是
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) }
    }
  }
}