2012-10-11 14 views
21

kullanma tip etiketleri, ben açabiliyorum:Scala 2.10'da yansıma yoluyla tip parametrelerini bulma? <em>bir tür</em> parametrelerini görmek için

scala> import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.universe._ 

scala> typeOf[List[Int]] 
res0: reflect.runtime.universe.Type = List[Int] 

Ama sadece oldukça programlı nasıl bilemiyorum oradan, bir de "Int" diye genel yol

(Ben bir saatliğine REPL içinde dolaşıyorum, ondan ne elde edebileceğimi görmek için, Yazım'daki permütasyonları deniyorum ... Bunun bir "Liste" olduğunu belirten pek çok şey var, ama Bu "Int" bulma konusunda iyi şanslar! Ve gerçekten toString() çıktısını ayrıştırmak için başvurmak istemiyorum ...)

Daniel Sobral, (her zamanki gibi) mükemmel bir genel bakışa sahip here Eğer biliyor sadece aradığım fakat ediyorum ne tantalizingly yakın (görünüşte), söz konusu sınıf için, türü bazı özel yöntem sorguya olabilir:

scala> res0.member(newTermName("head")) 
res1: reflect.runtime.universe.Symbol = method head 

scala> res1.typeSignatureIn(res0) 
res2: reflect.runtime.universe.Type = => Int 

Ama daha genel bir şey umuyoruz, ki bu da beyan edilen yöntemlerin listesinde köklenme içermiyor ve bunlardan birinin etiketin mevcut tip bilgisini bir yerlerde yakalayacağını (ve böylelikle) umuyor olmasını umuyorum.

Scala çok kolay bir şekilde yazdırıyorsa "Liste [Int]", niçin yeryüzünde bu "Int" parçasını bulmak çok zor - string desen eşlemesine başvurmadan? Yoksa gerçekten çok açık bir şey mi özlüyorum?

scala> res0.typeSymbol.asInstanceOf[ClassSymbol].typeParams 
res12: List[reflect.runtime.universe.Symbol] = List(type A) 

scala> res12.head.typeSignatureIn(res0) 
res13: reflect.runtime.universe.Type = 

Grr ... Ne yazık ki

+0

Bkz olmayan bir cevap var: M7 en azından bir iç döküm yoluyla tip argümanları alabilirsiniz ile API: 'typeOf [Liste [Int]]. AsInstanceOf [scala.reflect.internal.Types $ TypeApiImpl] .typeArguments'. –

+0

Zeki! Teşekkürler. – Tim

cevap

14

, sana parametreleri verecek bir yöntem var olduğunu sanmıyorum, ancak bunlardan ele bu şekilde elde edebilirsiniz:

Welcome to Scala version 2.10.0-20121007-145615-65a321c63e (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_35). 
Type in expressions to have them evaluated. 
Type :help for more information. 

scala> import scala.reflect.runtime.universe._ 
import scala.reflect.runtime.universe._ 

scala> typeOf[List[Int]] 
res0: reflect.runtime.universe.Type = scala.List[Int] 

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

scala> res1.head 
res2: reflect.runtime.universe.Type = Int 

Düzenleme İşte (bir discussion on scala-internals aşağıdaki) aynı şeyi başarmak için biraz daha güzel bir şekilde açıklanmıştır:

scala> res0.asInstanceOf[TypeRefApi].args 
res1: List[reflect.runtime.universe.Type] = List(Int) 
ile başlayarak
+0

Bu scala-internals posta listesinde tartışıldı: https://groups.google.com/forum/#!msg/scala-internals/R1iZXfotqds/zqq8QjMJj74J –

+0

Bunu yapmak için görünür! - Yine de (bağlantınıza referans olarak) Ben de senin rahatsızlığını paylaşıyorum! Burada kendi deneyimime, bunun neden en az şaşkınlık ilkesini ihlal ettiğine dair bir argüman olarak göstereceğim. – Tim

+0

https://groups.google.com/d/topic/scala-internals/56KRF98Mdjo/discussion –

İlgili konular