web-dev-qa-db-ja.com

Scalaで、(クラスのインスタンスではなく) `object`の*名前*を取得するにはどうすればよいですか?

Scalaでは、次のようにオブジェクトを宣言できます。

class Thing

object Thingy extends Thing

どうすれば"Thingy"(オブジェクトの名前)Scalaで?

Lift(ScalaのWebフレームワーク)がこれに対応していると聞きました。

19
Scoobie

クラスオブジェクトを取得してから、その名前を取得するだけです。

scala> Thingy.getClass.getName
res1: Java.lang.String = Thingy$

残っているのは、$を削除することだけです。

編集:

囲んでいるオブジェクトの名前と尾鉱を削除するには$で十分です。

res1.split("\\$").last
21
Kim Stebel

単なるobjectではなくcase objectとして宣言すると、自動的に Product trait が拡張され、productPrefixオブジェクトの名前を取得するメソッド:

scala> case object Thingy
defined module Thingy

scala> Thingy.productPrefix
res4: Java.lang.String = Thingy
22
DaoWen

どちらの方法が適切かはわかりませんが、これはScala Reflection:

implicitly[TypeTag[Thingy.type]].tpe.termSymbol.name.toString
2
Jacek L.