为解释器中定义的类抓取一个简单的类名

时间:2014-08-17 16:34:49

标签: scala

我想获得一个简单的类名,无论该类是在解释器中还是在scala代码文件中定义的。您无法从解释器中定义的类中获取简单名称(请参阅here)。因此,我尝试创建一个只获取完全限定名称的方法,将其拆分为.,然后获取最后一个字符串:

def simpleNameOf(i: AnyRef) = i.getClass.getName.split('.').last

然而,这是事情变得怪异的时候。

  

阶> def simpleNameOf(i:AnyRef)= i.getClass.getName.split('。')。last
  simpleNameOf:(i:AnyRef)String

     

阶> simpleNameOf(new Human)
  res25:String = $ read $ Human

     

阶> var h = new Human
  h:Human = Human @ fdad4ab

     

阶> h.getClass.getName
  res27:String = Human

     

阶> h.getClass.getName ==“Human”
  res28:Boolean = false

     

阶> h.getClass.getName.length
  res29:Int = 44

     

阶> h.getClass.getName.split( '')
   res30:Array [String] =   数组($ line102,$ read $ Human)

     

阶> “人” .split( '')
  res31:Array [String] = Array(Human)

那么,来自getClass.getName 44 字符的字符串是多长的? $ line102& $ read $人类来自哪里?

这是Scala 2.10.4

1 个答案:

答案 0 :(得分:3)

这是-Yrepl-class-based的另一个用例:

$ scala
Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_11).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class Foo
defined class Foo

scala> classOf[Foo].getSimpleName
java.lang.InternalError: Malformed class name
  at java.lang.Class.getSimpleName(Class.java:1317)
  ... 33 elided

scala> :q
$ scala -Yrepl-class-based
Welcome to Scala version 2.11.2 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_11).
Type in expressions to have them evaluated.
Type :help for more information.

scala> class Foo
defined class Foo

scala> classOf[Foo].getSimpleName
res0: String = Foo

您可以关闭cruft的输出过滤:

scala> $intp.isettings.unwrapStrings
res2: Boolean = true

scala> $intp.isettings.unwrapStrings = false
$intp.isettings.unwrapStrings: Boolean = false

scala> class Bar
defined class Bar

scala> classOf[Bar].getName
res3: String = $line12.$read$$iw$$iw$Bar

如果它吸引你。

最后一个问题:每一行都包含在一个通常深度嵌套的对象(或类)中,以便从历史记录中轻松查找输入。 (如果需要本地块语义,可以使用大括号。)每行都有一个行包。

更新:有一个getSimpleName问题的故障单,这个问题应该是IIRC到两个" $$"在错位的名字。这种情况发生在嵌套对象上,而不是类(在Scala意义上)。