2015-12-01 18 views
7

Chúng tôi có một số mã khớp mẫu mà chúng tôi mong đợi được cảnh báo bởi trình biên dịch là khớp không đầy đủ, nhưng chúng tôi không nhận được. Có một số trường hợp không thể thực hiện kiểm tra toàn diện?Kiểm tra mức độ phù hợp để khớp mẫu ở Scala 2.11

ví dụ ví dụ của chúng tôi (sử dụng scalactic Tốt + Xấu):

(maybeModelIdOrFailure, maybeMake) match { 

    case (Some(Good(modelId)), Some(makeId)) if modelId >= 0 && taxonomyService.isValidModel(makeId, modelId) => 
     Good(Some(MakeModelParameters(makeId, Some(modelId), modelLineId = None, index))) 

    case (Some(Good(modelLineId)), Some(makeId)) if modelLineId < 0 && taxonomyService.isValidModelLine(makeId, -1 * modelLineId) => 
     Good(Some(MakeModelParameters(makeId, modelId = None, modelLineId = Some(-1 * modelLineId), index))) 

    case (Some(Good(modelOrModelLineId)), Some(makeId)) => 
     Bad(One(IdNotFound(modelIdKeyName, modelOrModelLineId))) 

    case (Some(Good(modelId)), None) if modelId >= 0 => 
     Bad(One(IdInvalid(modelIdKeyName, "Model Id without Make Id"))) 

    case (Some(Good(modelLineId)), None) if modelLineId < 0 => 
     Bad(One(IdInvalid(modelIdKeyName, "Model Line Id without Make Id"))) 

    case (None, Some(makeId)) => Good(Some(MakeModelParameters(makeId, None, None, index))) 

    // case (None, None) => Good(None) 

    // case (Some(Bad(invalidParams)), _) => Bad(One(invalidParams)) 
    } 

Chúng tôi nhận xét hai dòng cuối cùng, nhưng trình biên dịch không cảnh báo và chúng tôi đã không vô hiệu hóa bất kỳ kiểm tra.

+1

Nó có thể liên quan đến https://issues.scala-lang.org/browse/SI-7631 (mặc dù nó không nên có hiệu ứng như vậy một mình). Bạn có thể thử di chuyển các điều kiện bảo vệ bên trong các nhánh (ví dụ: 'case (Some (Good (modelId)), None) => if (modelId> = 0) ... else ...') và kiểm tra xem điều này có hữu ích không. –

+0

Xin cảm ơn! thêm nó như là một câu trả lời và tôi sẽ chấp nhận nó! – longliveenduro

Trả lời

6

Từ Jason Zaugg's comment on SI-9232 có vẻ như các vệ sĩ hiện chỉ đơn giản là vô hiệu hóa tính năng kiểm tra toàn bộ (hoặc gần như vậy). Nếu đó là lý do, hãy di chuyển các điều kiện bảo vệ bên trong các nhánh (ví dụ: case (Some(Good(modelId)), None) => if (modelId >= 0) ... else ...) sẽ giúp ích. Các vấn đề khác có liên quan: https://issues.scala-lang.org/browse/SI-5365, https://issues.scala-lang.org/browse/SI-7631.

4

Có vẻ như scala chỉ tắt kiểm tra toàn bộ nếu bạn có bất kỳ người bảo vệ nào trong trận đấu. Trình biên dịch của tôi không tạo ra cảnh báo ngay cả về điều này:

def tt(s: Option[Int]) = s match { 
    case Some(x) if x > 0 => println(x) 
} 

Miễn là tôi giữ bảo vệ ở đó. Có vé với các cuộc thảo luận về điều này: https://issues.scala-lang.org/browse/SI-7631 https://issues.scala-lang.org/browse/SI-5365 Và có vẻ như có một số việc phải làm ở đây, vì vậy nó có thể cải thiện. Trình biên dịch Scala không thể kiểm tra tính bảo vệ đầy đủ trong hầu hết các trường hợp, bởi vì nó quá phức tạp để làm, nhưng trường hợp của bạn chắc chắn chứng minh rằng nó có thể được cải thiện.

+0

Có cảm ơn bạn cũng đúng. Nhưng tôi đã chấp nhận câu trả lời trước đó. Bạn đã có một upvote từ tôi mặc dù. – longliveenduro

+0

@longliveenduro Nhận xét của Alexey là bình luận đầu tiên, tôi không để ý đến nó. Vì vậy, nó tốt :) – Archeg

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