在 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
我是 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