2013-12-10 4 views
2

При выкапывании кажется, что это чувствительная проблема.Scala: Получение чистого имени класса

class TestNames { 

    private[this] lazy val _name: String = this.getClass.getName.split("\\.").last 
    def name: String = _name 

    } 

    class Parent extends TestNames 
    class Parent2 extends Parent 

class ClassNameExtraction extends FlatSpec { 

    it should "correctly extract the table name" in { 
    object TestNames extends TestNames 

    assert(TestNames.name === "TestNames") 
    } 

    it should "correctly extract the parent name" in { 
    object Parent extends Parent 

    assert(Parent.name === "Parent") 
    } 

    it should "correctly extract the column names" in { 
    object Parent2 extends Parent2 

    assert((Parent2.name === "Parent2")) 
    } 
} 

Я могу видеть, что есть простая схема: $$annonfun$number$ + ACTUAL_CLASS_NAME + $number$. Есть ли более простой способ сделать это?

Update:

Got что-то работает без наследования:

Однако это возвращает то же имя в подразделах классах:

class SomeOtherClass extends SomeClass {} 
object SomeOtherClass extends SomeOtherClass 
SomeOtherClass.name// is still SomeClass 
+0

Я подозреваю, что часть проблемы связана с самим тестом. Попробуйте переместить 'TestNames',' Parent' и 'Parent2' за пределы теста, имея некоторый' val' в тестовой точке для '* .name' и сравните' val' вместо '* .name'. –

+0

Вы также можете экспериментировать без «ленивых». –

ответ

2

Существует проблема:

https://issues.scala-lang.org/browse/SI-2034

Вам нужен класс или имя типа? Потому что это то, на что размышление.

Политика не в том, чтобы обсуждать религию, политику или манипулирование именами.

Смежные вопросы