0

建筑类:

class Building(val name: String, val skill: String, @volatile var workHours: Int) {

  var workers = new HashMap[Artisan, Int]()

  def doWork(worker: Artisan): Boolean = {
    ...
    workers.get(worker) match {
      case Some(i: Int) =>
        worker.cash += i
        true
      case None => false
    }
    ...
  }

工匠等级:

class Artisan(val skill: String, city: City) extends Player(skill, city) {
  var assignment = new Building("Empty", "", 0)

  def doWork() {
    if ( !assignment.doWork(this) )
    ...
  }

  def canEqual(other: Any): Boolean = other.isInstanceOf[Artisan]

  override def equals(other: Any): Boolean = other match {
    case that: Artisan =>
      (that canEqual this) &&
        assignment == that.assignment &&
        skill == that.skill
    case _ => false
  }

  override def hashCode(): Int = {
    val state = Seq(assignment, skill)
    state.map(_.hashCode()).foldLeft(0)((a, b) => 31 * a + b)
  }
}

测试用例:

@Test
def testIncome() {
  val building = new Building("Bakery", "Builder", 10)
  building.setSallery(100, player)  // add player to building hashmap
  player.assignment = building
  player.doWork()
  assertEquals("Should earn 100", player.cash, 100)
}

输出:

Negative test case

我看不出这段代码实际上是如何提供这个错误的。如果元素不存在,我的代码应该只返回 false 。通过调试程序,Artisan 对象被添加到我的哈希图中,所以我不明白为什么它会失败。

4

1 回答 1

1

returnScala 不鼓励使用。您的错误消息看起来好像整个函数都被评估了,即使有一个 return 语句。return如果像您这样的情况,有几种选择:

1) 使用选项

var workers = new HashMap[Artisan, Int]()

  def doWork(worker: Artisan): Boolean = {
    val maybeIncome = workers.get(worker)
    maybeIncome match {
        case None => false
        case Some(income) => {
          val result = <do something with income that returns Boolean>
          result
         }
       }
    }

2) 使用理解

var workers = new HashMap[Artisan, Int]()

  def doWork(worker: Artisan): Boolean = {
    val result = for { income <- workers.get(worker) } yield {
      <do something with income that returns boolean>
    }
    result getOrElse false
  }

更新:我看到您的 Artisan 类中有可变元素。使用这样的类作为键可能会产生不可预测的结果(我想知道为什么它甚至可能)。我宁愿定义两个映射:Map[ArtisanID, Artisan] 和 Map[ArtisanID,income],它们都有不可变的键。(ArtisanID 可以是唯一标识您的 Artisan 且永不更改的任何内容)。

于 2014-07-13T20:37:14.480 回答