在 Scala 中推广隐式函数

Generalize implicit function in scala

我是 Scala 的新手,在思考隐式函数时遇到了一些问题。

说我有一个隐式函数,它把 Strings 变成 Option[String] 写成

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

然后我有一个 XML 树,它可以有也可以没有属性 <thing>

我还有 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")
}

但是,我想把它贴在其他地方,这样它就可以用于 类 并且我不需要在两者中都重写它。这可能吗?

提前致谢。

隐式函数被认为是一种不好的做法,因为它们使代码更难遵循并更容易出错。他们目前需要语言导入才能在没有警告的情况下使用,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