2016-10-20 5 views
0
case class Keyword(id: Int = 0, words: String) 

val my= Keyword(123, "hello") 

val fields: Array[Field] = my.getClass.getDeclaredFields 

for (i <- fields.indices) { 

    println(fields(i).getName +":"+ my.productElement(i)) 

} 

ID: 123как отображать значение прецедентного класса в Скале

название: название ключевого слова

это нормально.

def outputCaseClass[A](obj:A){ 

    val fields: Array[Field] = obj.getClass.getDeclaredFields 

    for (i <- fields.indices) { 

    println(fields(i).getName +":"+ obj.productElement(i)) 

    } 
} 

outputCaseClass(my) 

это неправильно

+0

классы Case простираются 'product' так использовать итератор продукта, как описано здесь: http://stackoverflow.com/a/17827262/1154145 – nattyddubbs

+0

Спасибо так много. но когда я помещаю этот код в функцию, он не работает. –

+0

Что вам не хватает, так это 'implicit ClassTag' для' A', который понадобится для вашего метода для работы –

ответ

2

productElement является Метод Product базовой черты.

Попытка использовать метод подписи, как это:

def outputCaseClass[A <: Product](obj:A){ .. } 

Однако он по-прежнему не будет работать для внутренних классов случаев (fields также сообщает $outer -field, который productElement не вернется, и поэтому происходит сбой с IndexOutOfBoundsException).

+0

Спасибо. Я стараюсь def myFunction [A <: Product] (obj: A) = {..} Это работа. –

2
import scala.reflect.runtime.{universe => ru} 

def printCaseClassParams[C: scala.reflect.ClassTag](instance: C):Unit = { 
    val runtimeMirror = ru.runtimeMirror(instance.getClass.getClassLoader) 
    val instanceMirror = runtimeMirror.reflect(instance) 
    val tpe = instanceMirror.symbol.toType 

    tpe.members 
    .filter(member => member.asTerm.isCaseAccessor && member.asTerm.isMethod) 
    .map(member => { 
     val term = member.asTerm 
     val termName = term.name.toString 
     val termValue = instanceMirror.reflectField(term).get 
     termName + ":" + termValue 
    }) 
    .toList 
    .reverse 
    .foreach(s => println(s)) 
} 

// Now you can use it with any case classes, 

case class Keyword(id: Int = 0, words: String) 

val my = Keyword(123, "hello") 

printCaseClassParams(my) 
// id:123 
// words:hello 
+0

это здорово. Я стараюсь использовать много раз, но не смог. –

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

  • Нет связанных вопросов^_^