我可以在Scala中使用“yield”吗? (嵌套for循环产生组合向量)

时间:2014-06-22 05:47:13

标签: scala

免责声明:我对任何当代编码都很陌生。 (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已经有了一些内置的方法,让我可以免费使用。我认为根据一般教学目的弄清楚如何手动完成它是有价值的,但如果有一种单线方法,我真的应该使用我有兴趣了解它。

提前谢谢你......

1 个答案:

答案 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一样不可变。将DeckCard作为案例类也很方便。