首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >scala中隐函数的推广

scala中隐函数的推广
EN

Stack Overflow用户
提问于 2017-08-04 16:41:13
回答 1查看 80关注 0票数 0

我对Scala还不熟悉,在隐式函数方面遇到了一些困难。

假设我有一个隐式函数,它将Strings转换为编写的Option[String]

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

然后,我有一个XML树,它可以或者不能拥有属性<thing>

我还有两个类,它们使用这样的隐式函数:

代码语言:javascript
复制
case class ClassA(field: Option[String])

object ClassA {

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

代码语言:javascript
复制
case class ClassB(field: Option[String])

object ClassB {

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

是否有一种存储隐式函数的方法,使这两个单独的类都知道如何将String转换为Option[String]

通常,我会在stringToOption中加入这样的类:

代码语言:javascript
复制
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")
}

但是,我想把它放在其他地方,这样两个类都可以使用它,而且我不需要在这两个类中都重写它。这个是可能的吗?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-04 17:25:13

隐式函数被认为是一种糟糕的实践,因为它们使代码更难遵循,错误更容易出错。它们目前需要一个没有警告和人们正在讨论如何对它们进行严格限制。的语言导入才能使用。

尽管如此,还是可以按你的要求去做。在某个对象中定义您的隐式函数,然后在需要它的地方导入它。

代码语言:javascript
复制
object DangerousImplicits {
  implicit def stringToOption(s: String): Option[String] = if(s.isempty) {None} else {Some(s)}
}

现在,您可以将它导入到您想要的任何位置,即隐式转换。(我建议在最小化导入范围的方法内进行导入)

代码语言:javascript
复制
import DangerousImplicits.stringToOption
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45511779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档