2017-02-22 31 views
0

我一直在與Scala合作近一年,但偶爾偶爾遇到一段我不太瞭解的代碼。這次是這一次。我試圖查看「具有泛型參數類型的scala方法」上的文檔,但我仍然感到困惑。具有通用參數類型的Scala方法

def defaultCall[T](featureName : String) (block : => Option[T])(implicit name: String, list:Seq[String]) : Option[T] = 
{ 
    val value = block match { 
    case Some(n) => n match { 
     case i : Integer => /*-------Call another method----*/ 
     case s : String => /*--------Call another method----*/ 
     } 
     case _ => None 
} 

的方法是使用下面所示的代碼名爲:

var exValue = Some(10) 
val intialization = defaultCall[Integer]("StringName"){exValue} 

我沒有在上面瞭解什麼描述代碼是在defaultCall法「情況」的聲明。

我看到,當exValue有一個值並且不爲空時,代碼按預期工作。但如果我將exValue更改爲None,那麼我的代碼將進入「case _ = None」條件。我不明白爲什麼會發生這種情況,因爲在這裏完成的匹配是針對「整數」或「字符串」的「變量」。

+0

不要你的意思是'無功exValue =部分(10)'? –

+0

只是糾正它。謝謝你指出:) – Goldengirl

+0

你最初匹配'塊'。如果'block'是'None',爲什麼不去'case _ = None'? – Gal

回答

4

這裏會發生什麼事是,當你通過一個無它將匹配在第二種情況下,其「捕獲」的一切,是不是有些[T]的實例:

block match { 
    case Some(n) => // Will match when you pass an instance of Some[T] 
    case _  => // Will match on any other case 
} 

注意,無和有些是兩個不同的繼承自Option的類。

此外,變量匹配只在第一次匹配成功時完成,否則不會。爲了實現在第一場比賽的類型檢查,你可以這樣做:

block match { 
    case Some(n: Int) => // do stuff 
    case Some(n: String) => // do stuff 
    case _    => // Will match on any other case 
} 

希望幫助

相關問題