免责声明:我对任何当代编码都很陌生。 (BASIC几年前回到高中,有点像Python,现在我正在尝试自学Scala。)
这段代码应该生成一个随机的卡片组,其中包含我在前几行中自定义的套装和值。我有使用可变变量的代码,但是我总是认为最好避免使用可变变量,所以我尝试使用“yield”代替。这是我修改代码后的结果:
import util.Random.shuffle
val suits = Vector[String]("s", "m", "p")
val values = Vector[Int](1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 5, 5, 9)
class Card(val suit:String, val value:Int) {}
class Deck() {
var cardsInDeck:Vector[Card] = Vector()
}
def makeDeck(suits:Vector[String], values:Vector[Int]):Vector[Card] = {
for (i <- suits) yield {
for (j <- values) new Card(i, j)
}
}
val TheDeck = new Deck
TheDeck.cardsInDeck = util.Random.shuffle(makeDeck(suits, values))
for (i <- TheDeck.cardsInDeck) {
println(s"${i.suit}${i.value}")
}
这给了我一条错误信息,指向'i'后面的箭头并说出类型不匹配。
有什么类似的可行吗?
如果没有,你认为我应该坚持原始的可变变量版本吗? (我假设您可以想象这基本上是怎样的 - 从默认值变量开始,并在迭代嵌套循环时一次添加一个元素。)
最后,我猜Scala已经有了一些内置的方法,让我可以免费使用。我认为根据一般教学目的弄清楚如何手动完成它是有价值的,但如果有一种单线方法,我真的应该使用我有兴趣了解它。
提前谢谢你......
答案 0 :(得分:1)
def makeDeck(suits: Vector[String], values: Vector[Int]): Vector[Card] = {
for {
i <- suits
j <- values
} yield new Card(i, j)
}
你忘记了new Card
前的第二次收益。但是,不需要嵌套for循环,而是像上面那样构造它们。
您应该考虑将cardsInDeck
变为val
和构造函数参数,因此Deck
可以像Card
一样不可变。将Deck
和Card
作为案例类也很方便。