2017-08-04 74 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