1

私は scalap を使用して、Scala クラスに関する情報を分離しています。ケースクラスでは問題なく動作しますが、クラスが値クラスかどうかを確認したいです。これまでのところ、それを教えてくれるものは何も見つかりませんでした。値クラスと非値クラスを区別する方法を知っている人はいますか?

4

1 に答える 1

4
$ cat ValueClass.scala
class ValueClass(val s: String) extends AnyVal {
  def rcap = s.reverse.toUpperCase
}

$ scalap -cp . ValueClass
final class ValueClass extends scala.AnyVal {
  val s : scala.Predef.String = { /* compiled code */ }
  def this(s : scala.Predef.String) = { /* compiled code */ }
  def rcap : java.lang.String = { /* compiled code */ }
  override def hashCode() : scala.Int = { /* compiled code */ }
  override def equals(x$1 : scala.Any) : scala.Boolean = { /* compiled code */ }
}
object ValueClass extends scala.AnyRef {
  def this() = { /* compiled code */ }
  final def rcap$extension($this : ValueClass) : java.lang.String = { /* compiled code */ }
  final def hashCode$extension($this : ValueClass)() : scala.Int = { /* compiled code */ }
  final def equals$extension($this : ValueClass)(x$1 : scala.Any) : scala.Boolean = { /* compiled code */ }
}

最初の行はそれを示しています、いいえ?: final class ValueClass extends scala.AnyVal

編集:scalapを使用しておらず、実行時に実行したい場合は、(非常にハック的に)できます

class V(val v: Int) extends AnyVal {}
reflect.runtime.universe.typeOf[V].typeSymbol.companionSymbol.
  typeSignature.members.exists(_.name.toString.endsWith("$extension"))

少なくとも今のところ。たぶん、将来、つかみやすいisValueClass旗が出るでしょう。

于 2013-03-19T20:30:36.457 に答える