2010-06-27 100 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) 

代替。