2016-08-23 64 views
1

在今年的Devoxx會議上,Dick Wall在Scala編程中給出了presentation設計和模式;第一部分應該是基礎知識的簡要介紹。在1:09:35,他寫了如下函數:Scala:選項類型的數字運算

def safeDiv(a: Int, b: Int): Option[Int] = if (b == 0) None else Some(a/b) 

它返回一個編譯錯誤[good]。我的問題是,因爲這是遇到一個相當常見的場景:我該怎麼辦整數運算*/+ - 對

safeDiv(6, 2) // Some(2) 

safeDiv(6, 2) * 6 // 18 [error] 

回答

3

您不能詮釋繁殖選項,你一定要乘以期權的價值,像這樣:

saveDiv(6, 2).map (_ * 6) // Returns Option[Int] 

,或者您可以使用「皮條客我的圖書館」模式來定義方法「*」的詮釋的選項:

class PimpedOption(oi:Option[Int]) { 
    def *(i:Int) = oi.map(_*i) 
} 

implicit def instance(oi:Option[Int]) = new PimpedOption(oi) 

然後,你可以這樣做:

saveDiv(6, 2) * 6 // Gives Option[Int] 
+0

感謝@Nyavro,雖然我得到了一個警告,說我需要導入scala.language.implicitConversions,你的解決方案工作。不過,我想知道,除了在Option [Int]類型上定義方法之外,是否有更簡單的方法來完成此操作。我正在考慮將Option轉換爲Int的方式,Scala中有這樣的事情嗎? – 7kemZmani

+0

@Nyavro,你也可以創建一個'隱式類...',那麼你不需要單獨的'implicit def'。 @AbdulelahAlJeffery,你看看'getOrElse()'嗎? – jwvh

+0

其實你不能直接將Option [Int]轉換爲Int,因爲可能有None值。 – Nyavro

1

做它在映射塊返回值

saveDiv(6, 2).map(_ * 6) 
+0

謝謝@thirstycrow,您的解決方案成功了! – 7kemZmani