2017-08-04 71 views
0

我是Scala的新手,並且在隱式函數中纏繞一些麻煩。在Scala中概括隱式函數

說我有寫的是

implicit def stringToOption(s: String): Option[String] = if(s.isEmpty) { None } else { Some(s) }

然後,我有,要麼可以或不可以有一個屬性<thing>

我也有一個XML樹,輪流StringsOption[String]的隱函數2類使用這種隱式功能,例如:

case class ClassA(field: Option[String]) 

object ClassA { 

    implicit val decoder(nodeSeq: NodeSeq) => 
     ClassA(field = nodeSeq \@ "thing") 
} 

而且

case class ClassB(field: Option[String]) 

object ClassB { 

    implicit val decoder(nodeSeq: NodeSeq) => 
     ClassB(field = nodeSeq \@ "thing") 
} 

有沒有一種方法來存儲這樣的隱函數,這兩個獨立的類都知道轉String成兩個Option[String]

通常情況下,我會堅持在stringToOption入類等中的一個:

case class ClassB(field: Option[String]) 

object ClassB { 

    implicit def stringToOption(s: String): Option[String] = if(s.isempty) {None} else {Some(s)} 

    implicit val decoder(nodeSeq: NodeSeq) => 
     ClassB(field = nodeSeq \@ "thing") 
} 

但是,我想堅持到其他地方,以便它同時適用於類和我不需要重寫它同樣如此。這可能嗎?

在此先感謝。

+0

你會在哪裏使用'stringToOption'? –

+0

編輯這個問題希望能更好地解釋。謝謝! – LivingRobot

回答

2

隱式函數被認爲是一種不好的做法,因爲它們使代碼更難以遵循並使錯誤更容易。他們目前需要使用語言導入,無需警告和there is discussion to potentially heavily restrict them

這就是說,有可能做你想問的問題。 在某個對象中定義隱式函數,然後將其導入到需要的地方。

object DangerousImplicits { 
    implicit def stringToOption(s: String): Option[String] = if(s.isempty) {None} else {Some(s)} 
} 

現在,您可以將它導入到任何想要隱式轉換的位置。 (我會建議在導入範圍內導入以最小化導入範圍)

import DangerousImplicits.stringToOption 
+0

您能否提供一個參考文件,確認可能從未來版本的Scala中刪除隱式轉換? – Haspemulator

+0

@Haspemulator添加了相關PR討論的鏈接。 – puhlen