[[SCALAの記事一覧]]

&topicpath;
*目次 [#c52c9250]

*ScalaSigParser [#s2fe513f]
2010/01/23現在では、scalaの安定バージョンは2.7.7だが、バージョン2.8がNight Buildからダウンロードできるようになっており、ScalaSigParserが使えるようになっている。

具体的にはscalaのバージョン2.8をいれると下記に示すURLのサンプルコードのimport文でエラーがでなくなる。

参考URL

http://stackoverflow.com/questions/1833762/scala-reflection-getdeclaringtrait

変更内容

http://www.scala-lang.org/node/4587

*ScalaSigParserインポート [#lc55d886]
 import tools.scalap.scalax.rules.scalasig._
 import scala.runtime._

*例:RichDouble クラスの情報をパースしてみる。 [#h7ad17a9]
 val scalaSig = ScalaSigParser.parse(classOf[RichDouble]).get

**結果 [#x7f7a75a]
scalaSig にクラス情報が格納される。
実行結果の結果表示がたくさんあるため、14行程度で出力が打ち止めになっている。

 scalaSig: scala.tools.scalap.scalax.rules.scalasig.ScalaSig =
 ScalaSig version 5.0
 0:      ClassSymbol(RichDouble, owner=scala.runtime, flags=40000002, info=7 ,Non
 e)
 1:      RichDouble
 2:      scala.runtime
 3:      runtime
 4:      scala
 5:      scala
 6:      NoSymbol
 7:      ClassInfoType(ClassSymbol(RichDouble, owner=scala.runtime, flags=4000000
 2, info=7 ,None),List(TypeRefType(ThisType(java.lang),java.lang.Object,List()),
 TypeRefType(ThisType(scala),scala.Proxy,List()), TypeRefType(SingleType(SingleTy
 pe(ThisType(<nosymbol>.<root>),scala),scala.package),scala.package.Ordered,List
(TypeRefType(ThisType(scala),scala.Double,List()))), TypeRefType(ThisType(scala)
,scala.ScalaObject,List())))
 8:      TypeRefType(ThisType(java.lang),java.lang.Object,List())
 9:      ThisType(java.lang)
 10:     java.lang
 11:     lang
 12:     java
 13:     java
 14:     java.lang.O...

*クラス情報のtopLevelClassesの一つ目の情報を取得してみる。 [#pd2e01b3]
 val richDoubleSymbol = scalaSig.topLevelClasses.head

**結果 [#g8ef5134]
 richDoubleSymbol: scala.tools.scalap.scalax.rules.scalasig.ClassSymbol = ClassSy
mbol(RichDouble, owner=scala.runtime, flags=40000002, info=7 ,None)

*クラス情報のtopLevelClassesの一つ目の情報のメソッド情報をみてみる [#oe9b23ab]
 val methods = richDoubleSymbol.children filter ( _ match {
          case m : MethodSymbol => true
          case _ => false
      })

**結果 [#e29e0f28]
結果が改行無しで大量に表示されおり、途中で打ち止めになっている。

methods: Seq[scala.tools.scalap.scalax.rules.scalasig.Symbol] = List(MethodSymbo
l(x, owner=0, flags=20080004, info=32 ,None), MethodSymbol(<init>, owner=0, flag
s=200, info=42 ,None), MethodSymbol(self, owner=0, flags=200, info=48 ,None), Me
thodSymbol(compare, owner=0, flags=200, info=54 ,None), MethodSymbol(min, owner=
0, flags=200, info=62 ,None), MethodSymbol(max, owner=0, flags=200, info=66 ,Non
e), MethodSymbol(abs, owner=0, flags=200, info=70 ,None), MethodSymbol(round, ow
ner=0, flags=200, info=73 ,None), MethodSymbol(ceil, owner=0, flags=200, info=70
 ,None), MethodSymbol(floor, owner=0, flags=200, info=70 ,None), MethodSymbol(un
til, owner=0, flags=200, info=83 ,None), MethodSymbol(until, owner=0, flags=200,
 info=102 ,None), MethodSymbol(to, owner=0, flags=200, info=108 ,None), Metho...
 
**結果をみやすくしてみる [#l0eef9a2]
 methods foreach println

 MethodSymbol(x, owner=0, flags=20080004, info=32 ,None)
 MethodSymbol(<init>, owner=0, flags=200, info=42 ,None)
 MethodSymbol(self, owner=0, flags=200, info=48 ,None)
 MethodSymbol(compare, owner=0, flags=200, info=54 ,None)
 MethodSymbol(min, owner=0, flags=200, info=62 ,None)
 MethodSymbol(max, owner=0, flags=200, info=66 ,None)
 MethodSymbol(abs, owner=0, flags=200, info=70 ,None)
 MethodSymbol(round, owner=0, flags=200, info=73 ,None)
 MethodSymbol(ceil, owner=0, flags=200, info=70 ,None)
 MethodSymbol(floor, owner=0, flags=200, info=70 ,None)
 MethodSymbol(until, owner=0, flags=200, info=83 ,None)
 MethodSymbol(until, owner=0, flags=200, info=102 ,None)
 MethodSymbol(to, owner=0, flags=200, info=108 ,None)
 MethodSymbol(to, owner=0, flags=200, info=111 ,None)
 MethodSymbol(toRadians, owner=0, flags=200, info=70 ,None)
 MethodSymbol(toDegrees, owner=0, flags=200, info=70 ,None)
 MethodSymbol(isInfinity, owner=0, flags=200, info=120 ,None)
 MethodSymbol(isPosInfinity, owner=0, flags=200, info=120 ,None)
 MethodSymbol(isNegInfinity, owner=0, flags=200, info=120 ,None) 

どのようなメソッドが実装されているのか一覧を得ることができた。

*Traitなのかどうか調べる [#ube831a9]
 richDoubleSymbol.isTrait

**結果 [#t25fd345]
res1: Boolean = false


*他のクラスでTraitかどうか調べる方法一行バージョン [#u08114e6]

 ScalaSigParser.parse(classOf[Ordered[Any]]).get.topLevelClasses.head.isTrait

**結果 [#f11a5098]
res2: Boolean = true


*他参考URL [#d7a2d5da]

http://www.scala-lang.org/node/4721

*感想 [#v5bfe546]
ScalaSigParserに関する情報はまだ乏しく、こまめに検索などをして情報を集める必要があるかもしれません。

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS