我对Scala还不熟悉,在隐式函数方面遇到了一些困难。
假设我有一个隐式函数,它将Strings转换为编写的Option[String]
implicit def stringToOption(s: String): Option[String] = if(s.isEmpty) { None } else { Some(s) }
然后,我有一个XML树,它可以或者不能拥有属性<thing>。
我还有两个类,它们使用这样的隐式函数:
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")
}但是,我想把它放在其他地方,这样两个类都可以使用它,而且我不需要在这两个类中都重写它。这个是可能的吗?
提前谢谢。
发布于 2017-08-04 17:25:13
隐式函数被认为是一种糟糕的实践,因为它们使代码更难遵循,错误更容易出错。它们目前需要一个没有警告和人们正在讨论如何对它们进行严格限制。的语言导入才能使用。
尽管如此,还是可以按你的要求去做。在某个对象中定义您的隐式函数,然后在需要它的地方导入它。
object DangerousImplicits {
implicit def stringToOption(s: String): Option[String] = if(s.isempty) {None} else {Some(s)}
}现在,您可以将它导入到您想要的任何位置,即隐式转换。(我建议在最小化导入范围的方法内进行导入)
import DangerousImplicits.stringToOptionhttps://stackoverflow.com/questions/45511779
复制相似问题