【问题标题】:Scala Type Mismatch, Can't Resolve the ProblemScala 类型不匹配,无法解决问题
【发布时间】:2020-10-05 04:24:23
【问题描述】:

因此,对于一个项目,我正在尝试制作游戏生成的块移动的特定部分。所有坐标都存储在一个列表中,通过“x”和“y”值我应该能够将坐标相加,进而使块移动。

  def movement(move: Point): Unit = {
    val newList: List[Point] = placed
    val xx = move.x; val yy = move.y
    for (i <- newList.indices) newList(i) += Point(xx, yy)
  }

这里,“放置”是放置所有坐标的列表。 “Point”类型指的是“x”和“y”值。

这里的问题是,当我尝试将新值添加到坐标时,它会说:

类型不匹配。必需:字符串,找到:点

我觉得这很奇怪,因为我的列表不是以字符串类型启动的。有没有办法解决这个问题?

非常感谢。

添加了之前项目的示例:

  var playAnimal: List[Point] = List(Point(2,0), Point(1,0), Point(0,0))

  def checkForWrap (p: Point) : Point = {
    var x = p.x; var y = p.y
    x = if (x < 0) nrColumns - 1 else if (x > nrColumns - 1) 0 else x
    y = if (y < 0) nrRows - 1 else if (y > nrRows - 1) 0 else y
    Point(x, y)
  }

  def moveAnimal(): Unit = {
    if(!gameOver) {
      def newAnimalFront: Point = {
        val newHead: Point = currentDir match {
          case East()  => playAnimal.head + Point( 1,  0)
          case West()  => playAnimal.head + Point(-1,  0)
          case North() => playAnimal.head + Point( 0, -1)
          case South() => playAnimal.head + Point( 0,  1) 
        }
        checkForWrap(newHead)
      }
      playAnimal = newAnimalFront +: playAnimal.init
    }
  }

但是,此方法在我当前的项目中显示字符串不匹配。

【问题讨论】:

  • 如果newList(i)Point,那么Point += Point 应该做什么?
  • @jwvh 例如,如果块必须向下移动并且程序显示移动(Point(0,1)),则应将新点添加到 newList(i) 中。我可能做错了。
  • 您不是将其添加到列表中,而是将其添加到列表中索引i 的内容中,这是Point 的一个实例。
  • 1 - 您想在newList 中追加一个新元素,还是调整newList 中的每个元素? 2 - Scala List 是不可变的,并且由于 movement() 方法返回 Unit(即什么都没有),它对任何东西都没有影响。
  • 如果Point 有一个+ 方法(即Point + Point 是可能的),这并不意味着+= 是可能的。使用.map() 创建一个新的调整后的List[Point],然后将其分配给您的var 变量。 (顺便说一句,该代码是非常糟糕的 Scala 风格。)

标签: java string scala mismatch


【解决方案1】:

你需要做的两件事:

  1. 在你的类中定义Point方法+
  2. 避免突变(这取决于您,但您的代码会变得更具可读性)。

那么你可以这样写:

  def main(args: Array[String]): Unit = {
    val placed: List[Point] = List(Point(0, 0), Point(1, 1))
    println(placed.mkString) // Point(0,0)Point(1,1)
    val moved = movement(Point(2, 2), placed)
    println(moved.mkString) //Point(2,2)Point(3,3)
  }
  def movement(move: Point, placed: List[Point]): List[Point] = {
    // here you create new list and don't mutate the old one
    placed.map(p => p + move)
  }
  case class Point(x: Int, y: Int) {
    def +(p: Point) = Point(x + p.x, y + p.y)
  }

【讨论】:

  • 这解决了我的问题!非常感谢。
猜你喜欢
  • 2020-05-24
  • 2020-05-30
  • 2018-01-30
  • 1970-01-01
  • 2020-08-21
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多