您可以在 Kotlin 中使用 class 代替 struct:https://kotlinlang.org/docs/classes.html。两者之间存在一些相关的差异:
- 声明和类成员以及实现在同一个地方完成。
- 构造函数声明内置于类声明中。
- Kotlin 倾向于不变性。虽然您可以更频繁地重新分配字段,但您会看到
val(如 const)和不可变集合。
话虽如此,你会做这样的事情来在 Kotlin 中实现你的结构。以下不是文字的 1 对 1 翻译,而是如何使用惯用的 Kotlin 解决问题:
class Subject(val name: String) {
val objects = mutableListOf<NameOfThatClass>()
val numbers = mutableListOf<Int>()
}
在代码 sn-p 中发生的事情是我们正在声明一个类 Subject。它有一个构造函数,它接受一个名为name 的String 类型的参数。 val 关键字意味着该参数也将作为成员变量保留,并且该成员变量不能重新分配。接下来,在类主体中,我们声明并分配另外两个成员变量。由于val 关键字,objects 和numbers 也将不可重新分配,但它们不会接收构造函数参数作为值,而是接收调用mutableListOf() 的结果,这或多或少相当于@ 987654337@。我们也可以使用 arrayOfNulls(5) 和 arrayOfInt(5),但除非您非常需要固定大小的数组,否则在 Kotlin 中使用列表会更容易也更常见。
然后你会像这样使用它:
val myName = "foo"
val myFirstObject = ...
val myFirstNumber = 1
val mySubject = Subject(myName)
mySubject.objects += myFirstObject
mySubject.numbers += myFirstNumber
您看到的 += 并没有真正的重新分配,而是一个运算符重载,相当于 Kotlin 中的 std::vector 的 push_back():https://kotlinlang.org/docs/collection-write.html#adding-elements。
最后,如上所述,您通常会使用 Kotlin 的列表来代替 vector。但是,听起来您希望能够按名称查找特定条目,这与映射 https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.collections/-map/ 相比更有效。你可以这样做:
val myMap = mutableMapOf<String, Subject>()
// add to the map like this
myMap[name] = Subject(name)
// get from the map like this (returns null if not in the map)
val mySubject = myMap[name]
// check if the subject is already in the map like this
myMap.containsKey(name)
然后,如果您需要像使用 vector 一样遍历所有 Subjects,则可以使用 myMap.values 来仅获取 Subjects。