如何从 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
}
所以我想访问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
}