2015-02-15 9 views
20

Mã bên dưới không biên dịch nếu tôi bỏ ghi chú dòng được chỉ ra. Trình biên dịch phàn nàn: "yêu cầu định danh ổn định".Tại sao tôi không thể khớp mẫu trên Stream.empty trong Scala?

val Empty = Stream.empty  
val a = Stream.range(0, 5) 
a match { 
    // case Stream.empty => println("nope") <-- does not work 
    case Empty => println("compiles") <-- works 
    case _ => println("ok") 
} 

Nếu tôi gán Stream.empty để đánh giá Empty đầu tiên, nó hoạt động, nhưng nó cảm thấy lạ mà bạn không thể mô hình phù hợp trên một giá trị cơ bản như vậy mà không một hack như vậy.

Tôi có thiếu gì đó không?

Trả lời

38

Bạn không thể đối sánh mẫu trên Stream.empty vì phương thức (trong đối tượng Stream) luôn trả về luồng trống (nhưng trình biên dịch không biết điều đó).

Thay vì gán val empty = Stream.empty, bạn có thể kết hợp trên Stream.Empty, mà là một Object:

scala> a match { 
      case Stream.Empty => println("done") 
      case h #:: tl => println(h) 
     } 
+7

'trường hợp Stream() => 'làm việc quá –

5

Bạn không thể "so khớp mẫu" trên biến số không phải là hằng số.
Stream.empty không phải là "ổn định" định danh vì nó đại diện cho một số phương pháp:

/** The empty stream */ 
    override def empty[A]: Stream[A] = Empty 

rằng khả năng có thể trả lại bất kỳ giá trị bất cứ lúc nào.
Trình biên dịch không biết rằng giá trị trả về của nó luôn là Empty, do đó, nó phát hiện ra nó có khả năng thay đổi biến.
Quá sâu để phát hiện ra nó.

Tuy nhiên, khi bạn gán lại phương thức cho phương thức val (là số nhận dạng ổn định vì không thay đổi), mã của bạn có thể xử lý để khớp mẫu bằng cách sử dụng nó.

Bạn có thể đọc this, gợi lên giả thuyết giải thích lý do khớp mẫu khớp với kỳ vọng định danh ổn định.

Các vấn đề liên quan