【问题标题】:Get value of a literal type passed as type parameter获取作为类型参数传递的文字类型的值
【发布时间】:2021-04-02 12:30:09
【问题描述】:

我正在尝试编写一个宏,它返回作为类型参数传递的文字类型的值,如果参数不是文字类型,则无法编译。以下是一些示例:

def literalValue[SC <: String] = //...

literalValue["AB"] // returns "AB"
literalValue["C"] // returns "C"
literalValue[String] // compile error

所以我从一个常规的宏样板开始,遇到了以下问题:

def implStringLiteral[SC <: String: c.WeakTypeTag](c: blackbox.Context): c.Expr[SC] = {
  import c.universe._
  val symbol = weakTypeOf[SC].typeSymbol //It is String
  //...
}

似乎文字类型本身是作为常规String 传递的,因此无法通过其WeakTypeTag 获得精确的类型信息。

有什么办法可以解决这个问题吗?

【问题讨论】:

    标签: scala metaprogramming scala-macros


    【解决方案1】:

    ValueOf[T] typeclass 开箱即用地返回唯一的居民

    scala> valueOf
    def valueOf[T](implicit vt: ValueOf[T]): T
    scala> valueOf["AB"]
    val res2: String = AB
    
    scala> valueOf[42]
    val res3: Int = 42
    
    scala> object Foo
    object Foo
    
    scala> valueOf[Foo.type]
    val res4: Foo.type = Foo$@6e1ad658
    
    scala> valueOf[Unit]
    
    scala> .toString
    val res6: String = ()
    
    scala> valueOf[String]
                  ^
           error: No singleton value available for String.
    

    【讨论】:

    • 绝对酷,没听说过。非常感谢!
    猜你喜欢
    • 2021-02-12
    • 2019-02-27
    • 1970-01-01
    • 1970-01-01
    • 2021-02-13
    • 2011-07-15
    • 2019-03-05
    • 2019-04-24
    相关资源
    最近更新 更多