2015-02-04 15 views
9

Giả sử tôi có một đặc điểm, Phụ huynh, với một đứa con, Đứa trẻ.Làm cho Biên dịch thất bại khi không khớp hoàn toàn trong SBT

scala> sealed trait Parent 
defined trait Parent 

scala> case object Boy extends Parent 
defined module Boy 

Tôi viết một hàm phù hợp với đặc điểm được đóng kín. Hàm f của tôi là tổng số vì chỉ có một phiên bản Parent duy nhất.

scala> def f(p: Parent): Boolean = p match { 
    | case Boy => true 
    | } 
f: (p: Parent)Boolean 

Sau đó, 2 tháng sau đó, tôi quyết định thêm một đứa trẻ Girl của Parent.

scala> case object Girl extends Parent 
defined module Girl 

Và sau đó viết lại phương thức f vì chúng tôi đang sử dụng REPL.

scala> def f(p: Parent): Boolean = p match { 
    | case Boy => true 
    | } 
<console>:10: warning: match may not be exhaustive. 
It would fail on the following input: Girl 
     def f(p: Parent): Boolean = p match { 
           ^
f: (p: Parent)Boolean 

Nếu tôi gặp phải một trận đấu không đầy đủ, tôi sẽ nhận được cảnh báo biên dịch (như chúng ta thấy ở đây).

Tuy nhiên, làm cách nào tôi có thể thực hiện quá trình biên dịch không thành công trên kết quả không đầy đủ?

Trả lời

6

Bạn có thể thêm -Xfatal-warnings vào tùy chọn của Scalac. Bằng cách đó, mọi cảnh báo sẽ được coi là lỗi.

Trong SBT, bạn có thể đạt được điều đó với:

scalacOptions += "-Xfatal-warnings" 
+7

Kỹ thuật này trả lời câu hỏi, nhưng thường không phải là giải pháp khả thi. Cá nhân tôi muốn được nhìn thấy câu trả lời mà không yêu cầu thất bại trên tất cả các cảnh báo, ngay cả khi họ đang messier. –

+0

@TravisBrown: Viết ngắn trình biên dịch plugin hoặc plugin SBT của riêng bạn, đây là giải pháp duy nhất có sẵn. –

+0

@TravisBrown, tại sao nó thường không phải là một giải pháp "khả thi"? –

-4

Có lẽ bạn có thể đặt trong một trường hợp mặc định để bắt các yếu tố sau được xác định và ràng buộc nó vào một hàm từng phần mà bạn có thể quản lý riêng biệt. Sau đó, một phần sẽ hoạt động như một "trình xử lý mặc định".

sealed trait Animal 
    case class Dog(name: String) extends Animal 
    case class Cat(name: String) extends Animal 

    val t: Animal = Dog("fido") 

    // updates when the trait updates 
    val partial = PartialFunction[Animal, Unit] { 
    case Dog(_) => println("default dog") 
    case Cat(_) => println("default cat") 
    case _ => throw new RuntimeException("Broken") 
    } 

    // matches that may be out of date refer to it 
    t match { 
    case Dog(_) => println("specific dog") 
    case t => partial(t) 
    } 

Hoặc có thể bạn chỉ cần sử dụng PartialFunctions qua và kết nối chúng lại với nhau.

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