如何从 kotlin 中的数据 class 访问 val?

How can I access a val from a data class in kotlin?

所以我想访问isInBounds

Navigation.kt:

data class Coordinate(val x:Int , val y:Int){

    val isInBounds = x >= 0 && y >= 0

    operator fun plus(other:Coordinate) = Coordinate(x + other.x, y + other.y)

}

但是当我尝试访问它时,我得到了一个未解析的引用。

Game.kt

private fun move(directionInput: String) = try {
    val direction = Direction.valueOf(directionInput.uppercase())
    val newPosition = direction.updateCoordinate(player.currentPosition)


    

    if (!newPosition.isInBounds){

    }
    else{

    }
} catch (e: Exception){

}
enum class Direction(private val  coordinate: Coordinate){
    NORTH(Coordinate(0 , -1)),     
    EAST(Coordinate(1 , 0)),     
    SOUTH(Coordinate(0 , 1)),     
    WEST(Coordinate(-1 , 0));      
    fun updateCoordinate(playerCoordinate:Coordinate) {         
        coordinate + playerCoordinate     
    } 
}

你的 updateCoordinate 函数实际上并没有完成任何事情,因为它计算了一些东西而不对结果做任何事情,比如 returning 它。因此,它隐含了returns Unit,所以newPosition只是对Unit的引用。

将函数更改为return新坐标:

fun updateCoordinate(playerCoordinate: Coordinate): Coordinate {         
    return coordinate + playerCoordinate     
} 

我建议给这个函数一个更好的名字。 “更新”一词意味着它正在改变传递给它的实例,而不是计算一个新实例。

从逻辑上讲,由于此函数是向坐标添加一些东西,因此将代码反转(交换接收器和参数)对于易读性和易于推理的代码更有意义。所以我会把这个函数从枚举中拉出来 class 并使它成为坐标扩展函数。

fun Coordinate.moved(direction: Direction): Coordinate {
    return this + direction.coordinate
}

但您必须将方向设为 coordinate 属性 public 或 internal.

错误在Direction。请注意,您没有为 updateCoordinate 指定 return 类型,您使用了块体。这意味着它隐含地 returns Unit。所以updateCoordinate计算coordinate + playerCoordinate,舍弃结果,returns Unit。这导致 newPosition 成为 Unit,并且显然不会有 isInBounds 属性.

显然这不是你想要的。您应该改为使用表达式正文声明 updateCoordinate

fun updateCoordinate(playerCoordinate:Coordinate) =
    coordinate + playerCoordinate

或者如果你喜欢块体:

fun updateCoordinate(playerCoordinate:Coordinate): Coordinate {
    return coordinate + playerCoordinate
}

这只是我的意见,但我认为将 updateCoordinate 作为 Coordinate 上的方法更具可读性,称为 movedTowards:

data class Coordinate(val x: Int, val y: Int) {
    operator fun plus(coord: Coordinate) = ...

    fun movedTowards(direction: Direction) =
        this + direction.coordinate // you'd have to make direction.coordinate public
}