您可以在 Kotlin 中使用 struct
代替 class
: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>()
}
该代码片段中发生的事情是我们声明了一个类 Subject
。它有一个构造函数,它接受一个名为 name
的类型为 String
的参数。 val
关键字表示参数也将作为成员变量保留,并且该成员变量不能重新分配。接下来,在类体中,我们声明并分配另外两个成员变量。 objects
和 numbers
也不会因为 val
关键字而被重新赋值,而是接收构造函数参数作为值而不是它们接收调用 mutableListOf()
的结果,它创建或多或少相当于 vector
。我们也可以使用 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)
然后,如果您需要像使用 Subject
一样遍历所有 vector
,您可以使用 myMap.values
只获取 Subject
。
本文链接:https://www.f2er.com/548.html