提问者:小点点

静态编程语言:遍历对象的组件


每个数据类对象都有一个组件,用于每个属性,如组件1、组件2等。我想知道在静态编程语言中是否有任何方法可以迭代类的每个组件。假设我有类:

data class User(age:Int, name:String)

我可以这样做吗:

for(component in aUserObject){
    //do some stuff with age or name
}

?


共3个答案

匿名用户

首先,组件N属性仅在数据类上可用,而不是在每个对象上。

没有专门用于迭代组件的API,但您可以使用静态编程语言反射来迭代任何类的属性:

class User(val age: Int, val name: String)

fun main(args: Array<String>) {
    val user = User(25, "Bob")
    for (prop in User::class.memberProperties) {
        println("${prop.name} = ${prop.get(user)}")
    }  
}

匿名用户

此外,您可以将属性委托与内置委托“by map”一起使用。它对于一些简单的stat类非常有用。

class DbUsingStat {
  private val map = mutableMapOf(
    "removed" to 0,
    "updated" to 0,
    "skipped" to 0
  )

  var removed by map
  var updated by map
  var skipped by map

  fun asMap() : Map<String, Int> = map.toMap()
}

...
...


val someStatistic = DbUsingStat().apply {
  skipped = 5
  removed = 10
  updated = 1505
}

for((k, v) in someStatistic.asMap())
  println("$k: $v")

匿名用户

对于任何寻找无反射解决方案的人来说,这里有一个。

重要提示:这要求您能够修改User数据类。

您可以将自己的迭代器函数写入数据类,如下所示:

data class User(age: Int, name: String) {
    operator fun iterator(): Iterator<Pair<String, Any>> {
        return listOf("age" to age, "name" to name)
    }
}

尽管一开始有点麻烦,但这允许您像这样使用for-each样式循环,因为静态编程语言在后台调用iterator()函数来使for-each循环工作:

val aUserObject: User = User(36, "John Doe")
for ((key, value) in aUserObject) {
    println("$key: $value") // age: 36
                            // name: John Doe
}

这使您的User类保持为数据类,并且不需要使用反射。