0

私はman.typeArgumentsいくつかの 2.9.2 コードで使用していましたが、Manifests が非推奨であるというメッセージを受け取りました。typeOf[T]メソッドにアクセスする方法はわかりました<:<が、一生どこに行ったのかわかりませんtypeArguments

文脈のために、私はcreateParser[T: TypeTag]メソッドを書いています。Tが の場合List[X]、 のリストをチェーンしてパーサーを作成しますcreateParser[X]。または、とにかく、それが私がやりたいことです。

(または、または他の考えられる隣接概念Xからどのように取得する必要があるかを知っている人はいますか?TtypeOf[T]typeTag[T]T

2.9.2 のコードは次のとおりです。

  def getParser[T](implicit man: Manifest[T]): Parser[T] = {
    if (man <:< manifest[Stream[_]]) {
      val itemType = man.typeArguments(0)
      streamParser(itemType).asInstanceOf[Parser[T]]
    } else {
      parsers(man)().asInstanceOf[Parser[T]]
    }
  }

  def streamParser[T](implicit man: Manifest[T]): Parser[Stream[T]] = {
    val itemParser = getParser(man)
    (openParser("[") ~> repsep(itemParser, comma) <~ closeParser("]")) ^^ (_.toStream)
  }

これが私が2.10.1で試していることですが、うまくいきません:

  def getParser[T](implicit tag: TypeTag[T]): Parser[T] = {
    if (tag.tpe <:< typeOf[Stream[_]]) tag.tpe match {
      case TypeRef(_, _, List(itemType)) => streamParser(itemType).asInstanceOf[Parser[T]]
    } else {
      parsers(tag)().asInstanceOf[Parser[T]]
    }
  }

  def streamParser[T](implicit tag: TypeTag[T]): Parser[Stream[T]] = {
    val itemParser = getParser(tag)
    (openParser("[") ~> repsep(itemParser, comma) <~ closeParser("]")) ^^ (_.toStream)
  }

問題は、 がリフレクション API からのものであると表示されていることですが、それを に送信するのに適した に変換する方法がわかりitemTypeません。TypeTypeTagstreamParser

そのparsers値は実際には s からTypeTags へのマップであり、すべてをメソッドに入れ、解析したいものの型に一致させる方Parserがおそらくきれいでしょうが、型のパターン マッチングの試みはうまくいかなかったようです。getParserこれまでの作業。

これを行う簡単な方法があると確信しています。私は、新しい実装とそれに追いついていないドキュメントの間で板挟みになっているだけだと思います。

4

1 に答える 1

1

2.10 (および 2.11 ではさらに) では、型とツリーから情報を抽出する方法は、パターン マッチングを使用することTypeRefです。

scala> typeOf[List[Int]] match { case TypeRef(_, _, args) => args }
res13: List[reflect.runtime.universe.Type] = List(Int)

scala> typeOf[Map[Int, String]] match { case TypeRef(_, _, args) => args }
res14: List[reflect.runtime.universe.Type] = List(Int, String)

scala> val TypeRef(_, _, args) = typeOf[List[Int]] // slightly shorter
args: List[reflect.runtime.universe.Type] = List(Int)
于 2013-03-24T11:10:12.830 に答える