我想获得一个简单的类名,无论该类是在解释器中还是在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
答案 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意义上)。