2013-03-24 4 views
0

일부 2.9.2 코드에서 man.typeArguments을 사용하고 있었으나 Manifest은 더 이상 사용되지 않습니다. 나는 <:< 방법에 접근하기 위해 typeOf[T]을 사용하는 방법을 찾았지만, 내 인생을 위해서 typeArguments이 어디로 갔는지 알 수 없다.typeArguments는 어떻게 가져 옵니까?

문맥을 위해, 나는 createParser[T: TypeTag] 방법을 쓰고있다. TList[X] 인 경우 createParser[X]의 목록을 연결하여 파서를 만듭니다. 또는 그게 어쨌든 내가하고 싶은 것입니다.

누구 내가 T (또는 typeOf[T] 또는 typeTag[T] 또는 다른 생각할 수 T -adjacent 개념에서 X을 얻는 방법을 알고 여기에

는 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) 
    } 

문제는 t는 itemType입니다. 반사 API의 Type이지만, streamParser으로 보내기에 적합한 TypeTag으로 변환하는 방법을 알아낼 수 없습니다.

parsers 값이 실제로 Parser s의 TypeTag s의 맵이며, 아마 내가 분석 할 물건의 종류에 getParser 방법에 모든 것을 넣어 일치 청소기 것이지만, 그 패턴에서 내 시도 지금까지는 타입에 매치하지 않는 것 같았다.

나는 이것을 할 수있는 쉬운 방법이 있다고 확신한다. 나는 새로운 구현과 그것에 익숙하지 않은 문서 사이에 끼어 들었다고 생각한다. (보다 2.11과)

+0

, 스칼라 때문에 반사는 아직 실험적입니다. – ghik

+0

이것이 공식적으로 사실이지만, 그 사용으로 인해 컴파일러 경고가 표시됩니다. – TOB

+0

실제로'deprecation 경고를 발생시키는 것은'<: <'메쏘드 일 뿐이므로,'TypeTag'이 필요한 것을 할 수있을 때까지 그것들을 고수 할 것입니다. – TOB

답변

1
2.10에서

유형과 나무에서 정보를 추출하는 방법은 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) 
+0

이것은 내가 찾고있는 것처럼 보였습니다. 그리고 나서 그것을 시도했지만 그렇지 않았습니다. 질문을 수정하여 명확하게 만듭니다. – TOB

+0

@TOB : 원하는 작업을 수행 할 수 없습니다. TypeTags를 추가하는 것은 컴파일 타임 작업이므로 런타임에 추출하지 않고 컴파일러에서 인식 할 수 있다고 가정합니다. 필자가 원하는 것은'파서 '가'Map [Type, Parser [_]]'이라는 것입니다. – sschaef

+0

2.9.2에서'.typeArguments'와'Manifest'로 작업한다는 점을 제외하고는. 더 이상 가능하지 않은 것이 있습니까? – TOB

관련 문제