20

在 Scala 中,我可以像这样声明一个对象:

class Thing

object Thingy extends Thing

我将如何"Thingy"在 Scala 中获得(对象的名称)?

我听说 Lift(Scala 的 Web 框架)能够做到这一点。

4

4 回答 4

31

如果您将其声明为 acase object而不仅仅是 anobject那么它将自动扩展Product特征,您可以调用该productPrefix方法来获取对象的名称:

scala> case object Thingy
defined module Thingy

scala> Thingy.productPrefix
res4: java.lang.String = Thingy
于 2012-10-21T18:55:03.750 回答
23

只需获取类对象,然后获取其名称。

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

剩下的就是删除$.

编辑:

要删除封闭对象的名称和拖尾$就足够了

res1.split("\\$").last
于 2012-10-21T05:56:06.737 回答
3

我不知道哪种方式是正确的方式,但这可以通过 Scala 反射来实现:

implicitly[TypeTag[Thingy.type]].tpe.termSymbol.name.toString
于 2015-04-04T05:21:06.937 回答
0
def nameOf[T](implicit ev: ClassTag[T]):String = ev.runtimeClass.getName.replace("$", "")
于 2020-12-03T13:40:28.003 回答