我是 Kotlin 新手,我决定编写一个简单的文本游戏。当我尝试访问敌人的生成率(女巫无关)时,我总是收到错误:
Kotlin: Unresolved reference. None of the following candidates is applicable because of receiver type mismatch:
public operator fun MatchGroupCollection.get(name: String): MatchGroup? defined in kotlin.text
.get
我的 IDE 中变成红色。
这是我的敌人龙:
"dragon" to mapOf(
"spawnRate" to mapOf("hill" to 1.01),
"drops" to mapOf(
"dragon scale" to mapOf("quantity" to listOf(1,10)),
"dragon egg" to 0.01,
"dragon head" to 1.01,
),
"exp" to listOf(1, 4),
"dmg" to listOf(35,75),
),
我试图像这样访问spawnRate:
val dragonSpawnRate = mobs["dragon"]?.get("spawnRate")?.get("hill")
println("Dragon Spawn Rate: $dragonSpawnRate")
我尝试了更多的想法,但最终都出现了同样的错误。
val dragon = mobs["dragon"]?.get("spawnRate")
val dragonSpawnRate = dragon?.get("hill")
//-----------------------------------------------
val dragon = mobs["dragon"]?.get("spawnRate")
val dragonSpawnRate = dragon["hill"]
我还尝试了这个问题的一些解决方案: https://stackoverflow.com/questions/61660123/define-class-parameter-with-get-at-kotlin
但他们都没有帮助。我也尝试询问chat gpt,但也没有帮助。
顾名思义,集合用于存储相似项目的集合。映射适用于从用户 ID 映射到用户数据等情况。在这种情况下,每个项目几乎都是相同的情况。
在您的示例中,每个项目都是一个完全不同的故事:其中一些是数字,其中一些是列表或其他地图。地图并不是真正为这种情况设计的。它们可以存储此类数据,但我们将丢失类型信息,因此我们必须在需要时转换值:
如果我们有多个具有非常特定含义的已知字段,我们不应该将它们存储在映射中,而应该存储在类中。在 Kotlin 中,我们可以使用数据类来实现此目的:
免责声明:我不确定
IntRange
这是否是一个好主意。这并不是 Kotlin 特有的。这条规则几乎适用于所有强类型语言。