2010-06-27 82 views
2
import java.util.Random 
class Kostka { 
    val rand = new Random(System.currentTimeMillis()) 
    val value: List[Int] = List(rand.nextInt(6+1)) 
} 
object MyRandom { 
    def Fill[A](n: Int): List[A] = { 
     if (n<=0) Nil 
     else { 
      var lst = List[A] 
      for (i <- 1 to n){ 
       lst ++= (new Kostka).value 
     } 
      return lst 
     } 
    } 
} 
object Gra { 
    def main(args: Array[String]): Unit = { 
     println("Podaj liczbe kosci\n") 
     val kosci: List[Kostka] = MyRandom.Fill[Kostka](10) 
     // Policzenie wyniku 
     println("Strzelaj ile razem wypadło\n") 
     // przyjecie wyniku 
     // dopisac ile wypadlo czyli wynik 
     println("Wypadlo: ") 
     println(kosci.toString) 
    } 
} 

和错误:斯卡拉从我想申请方法

a.scala:10: error: missing arguments for method apply in object  List; 
follow this method with `_' if you want to treat it as a partially applied function 
      var lst = List[A] 
        ^
one error found 

当我有:

var lst = List[A]() 

我得到这个错误:

a.scala:12: error: type mismatch; 
found : List[Any] 
required: List[A] 
       lst ++= (new Kostka).value 
       ^
one error found 

回答

3

在LST声明你忘了父母:lst = List[A]() 事实上,List[A](a,b,c)List[A].apply(a,b,c)的一个合成糖,这就是为什么编译器抱怨apply的论点。

编辑:您可以使用ListBuffer而不是您的列表(在Fill方法中,顺便说一句,名称应该填充(比较http://davetron5000.github.com/scala-style/))。当你完成缓冲区上的工作时,你可以调用toList,它在常量上计算;)。

+0

如果我使用ListBuffer而不是List,那么利润是多少? – matiit 2010-06-27 11:21:19

+0

@matiit:'List'是不可变的。 'ListBuffer'是可变的。选择最符合您需求的产品。 – 2010-06-27 14:33:43

+0

特别是,在'List'的末尾添加一个元素,就像使用'lst ++ =(new Kostka).value'所做的那样,代价很高,因为需要复制'lst'。将一个元素添加到'List'的末尾需要一段时间。 – 2010-06-27 19:10:11

1

有关一般准则,请参阅Aymen's answer。更新后,您有以下效果。

Kostka.value有型号List[Int]lst有型号List[A]。追加结果(++)是最不常见的超类型List[Int]List[A],它是List[Any]。但是List[Any]不是List[A]的子类型。这就是为什么你的类型不匹配。

Fill方法不应该是通用的摆在首位,除非你Kostka通用的,太。

此外,使用new Kostka结合PRNG初始化也看起来很奇怪。

最后,在斯卡拉2.8有一个fill方法对收集的同伴:

scala> val r = new java.util.Random 
r: java.util.Random = [email protected] 

scala> List.fill(10) {r.nextInt(6+1)} 
res4: List[Int] = List(3, 6, 4, 1, 2, 4, 0, 4, 6, 4) 

,除非你的骰子是7片面的,你可以去

scala> List.fill(10) {r.nextInt(6) + 1} 
res5: List[Int] = List(2, 5, 2, 1, 1, 4, 4, 2, 6, 3) 

代替。