2012-08-11 37 views
6

Trong khi tôi đang viết một số mã Scala, tôi nhận được một thông báo lỗi lạ khi cố gắng biên dịch mã. Tôi đã phá mã xuống thành một mã đơn giản hơn nhiều (điều này hoàn toàn không có ý nghĩa gì từ một quan điểm ngữ nghĩa, nhưng vẫn hiển thị lỗi).Lỗi lạ khi biên dịch vòng lặp for

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

import scala.collection.mutable.ListBuffer 

val map = scala.collection.mutable.Map[Int, ListBuffer[Int]]() 
for (i <- 1 to 2) { 
    map.get(0) match { 
    case None => map += (1 -> ListBuffer[Int](1)) 
    case Some(l: ListBuffer[Int]) => l += i 
    } 
} 

// Exiting paste mode, now interpreting. 

<console>:12: error: type arguments [Any] do not conform to trait Cloneable's t 
pe parameter bounds [+A <: AnyRef] 
       for (i <- 1 to 2) { 
         ^

Khi thêm một dòng thêm vào cuối của vòng lặp for, mã hoạt động:

scala> :paste 
// Entering paste mode (ctrl-D to finish) 

import scala.collection.mutable.ListBuffer 

val map = scala.collection.mutable.Map[Int, ListBuffer[Int]]() 
for (i <- 1 to 2) { 
    map.get(0) match { 
    case None => map += (1 -> ListBuffer[Int](1)) 
    case Some(l: ListBuffer[Int]) => l += i 
    } 
    1 // <- With this line it works 
} 

// Exiting paste mode, now interpreting. 

warning: there were 1 unchecked warnings; re-run with -unchecked for details 
import scala.collection.mutable.ListBuffer 
map: scala.collection.mutable.Map[Int,scala.collection.mutable.ListBuffer[Int]] 
= Map(1 -> ListBuffer(1)) 

tôi đoán, nó có cái gì để làm với các giá trị trở lại của trận đấu-trường tuyên bố . Nhưng tôi không phải là Scala-expert đủ để tìm ra lý do đằng sau thông báo lỗi này và những gì tôi đang làm sai. Tôi hy vọng, một người khôn ngoan hơn có thể giúp đỡ ở đây.

Lý do đằng sau thông báo lỗi là gì? Có gì sai với câu lệnh match-case-statement?

UPDATE: Thử nghiệm với Scala 2.9.2

+0

Đây có thể là lỗi. Với 2,10 nó hoạt động tốt. – sschaef

Trả lời

6

Bạn đang nhìn thấy this bug trong hành động. Nó được sửa trong 2,10 và có cách giải quyết dễ dàng trong this answer —chỉ thêm chú thích loại ở đâu đó:

for (i <- 1 to 2) { 
    map.get(0) match { 
    case None => map += (1 -> ListBuffer[Int](1)) 
    case Some(l: ListBuffer[Int]) => (l += i): Unit 
    } 
} 
+0

Cảm ơn bạn rất nhiều để chỉ ra điều này. –