2017-03-01 18 views
3

我目前正在實現一個小型的內部使用的實用程序,可以將數據從一組Excel文件導入到我們的應用程序中。根據Excel單元格的類型,我決定如何處理數據。 Excel文件只能包含字符串,數字和布爾單元格,如果遇到其他單元格,則程序在運行時可自由崩潰。如何在Scala中禁止「匹配不完全」警告?

現在Scala是正確地警告我,細胞類型的比賽並不詳盡,細胞可以有空白,公式,錯誤的類型...

有沒有辦法如何抑制警告,除了

t match { 
    case STRING => ??? 
    case NUMERIC => ??? 
    case BOOLEAN => ??? 
    case _ => throw new MatchError() // redundant, just to suppress the compile time warning 
} 
+0

規範問題有一個非常具體的問題和答案。這個問題更一般,不應該被認爲是重複的。如果有的話,鏈接的問題需要編輯。 – noah

回答

5

您可以使用unchecked註釋:

(t: @unchecked) match { 
    case STRING => ??? 
    case NUMERIC => ??? 
    case BOOLEAN => ??? 
} 

正如其他人所說,你應該避免使用它,並相應地選擇你的類型,以避免這種警告(例如通過使用密封特性)。但是,如果您發現自己無法這樣做,並且您有某種不變的保證您的類型始終是給定類型之一,則使用@unchecked可解決您的問題。

+0

非常感謝!我知道有一些註釋,但我從來沒有使用它,所以我已經忘記,如果真的,哪一個:) 我同意你應該避免它。在這種情況下,我需要處理的Excel可能包含「無效」單元,因此這些類型不適合我定義。如果excel無效(用於我的程序目的),我希望程序崩潰並且運行時異常。所以這裏的註釋是完美的:) –

1

這是不推薦的(通常爲案例),但如果你真的需要它,使用PartialFuncion明顯的一個?::

sealed trait Trait 
case object A extends Trait 
case object B extends Trait 


scala> def f(x: Trait) = x match { 
|  case A => println("A") 
| } 
<console>:13: warning: match may not be exhaustive. 
It would fail on the following input: B 
     def f(x: Trait) = x match { 
         ^
f: (x: Trait)Unit 


scala> val f: PartialFunction[Trait, Unit] = { 
|  case A => println("A") 
| } 
f: PartialFunction[Trait,Unit] = <function1> 

scala> f(A) 
A 

scala> f(B) 
scala.MatchError: B (of class B$) 
    at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:254) 
    at scala.PartialFunction$$anon$1.apply(PartialFunction.scala:252) 
    at $anonfun$1.applyOrElse(<console>:14) 
    at $anonfun$1.applyOrElse(<console>:13) 
    at scala.runtime.AbstractPartialFunction.apply(AbstractPartialFunction.scala:34) 
    ... 29 elided 

的disadvant部分功能的年齡是它們會產生運行時異常的風險。但它們比@unchecked方法更安全(應該在極端情況下使用) - 至少用戶可以從類型本身中看到潛在的異常。

在你的情況我建議你使用Option和獨立的邏輯從效果:

def f(x: Trait) = x match { 
    case A => Some("A") 
    case _ => None 
    } 

    def effect(x: Option[String]) = x.foreach(println) //you can use getOrElse(throw RuntimeException) here 

    def run(x: Trait) = effect(f(x)) 

scala> run(A) 
A 

scala> run(B)