我看到我正在处理的一些 Scala 2.7.7 代码存在问题,如果它是用 Java 编写的,则不应该发生这种情况。松散地,代码创建了一堆纸牌玩家并将他们分配给桌子。
class Player(val playerNumber : Int)
class Table (val tableNumber : Int) {
var players : List[Player] = List()
def registerPlayer(player : Player) {
println("Registering player " + player.playerNumber + " on table " + tableNumber)
players = player :: players
}
}
object PlayerRegistrar {
def assignPlayersToTables(playSamplesToExecute : Int, playersPerTable:Int) = {
val numTables = playSamplesToExecute / playersPerTable
val tables = (1 to numTables).map(new Table(_))
assert(tables.size == numTables)
(0 until playSamplesToExecute).foreach {playSample =>
val tableNumber : Int = playSample % numTables
tables(tableNumber).registerPlayer(new Player(playSample))
}
tables
}
}
PlayerRegistrar 在桌子之间分配一些玩家。首先,它计算出需要多少张桌子才能将玩家分开并创建他们的列表。
然后在代码的第二部分,它计算出应该将玩家分配到哪个桌子,从列表中拉出该桌子并在该桌子上注册一个新玩家。
桌子上的玩家列表是一个 var,每次调用 registerPlayer() 时都会被覆盖。我通过一个简单的 TestNG 测试检查了它是否正常工作:
@Test def testRegisterPlayer_multiplePlayers() {
val table = new Table(1)
(1 to 10).foreach { playerNumber =>
val player = new Player(playerNumber)
table.registerPlayer(player)
assert(table.players.contains(player))
assert(table.players.length == playerNumber)
}
}
然后我测试表分配:
@Test def testAssignPlayerToTables_1table() = {
val tables = PlayerRegistrar.assignPlayersToTables(10, 10)
assertEquals(tables.length, 1)
assertEquals(tables(0).players.length, 10)
}
测试失败并显示“预期:<10> 但为:<0>”。我一直在摸不着头脑,但无法弄清楚为什么 registerPlayer() 没有改变列表中的表格。任何帮助,将不胜感激。