在json4s中,代码可以这样写:
import org.json4s._
import org.json4s.jackson.JsonMethods._
...
val x: MonadicJValue = JObject()
这是正确的,因为功能
implicit def jvalue2monadic(jv: JValue) = new MonadicJValue(jv)
第一行import org.json4s._
行将导入范围。
(source of jvalue2monadic defination on github)
但是,我尝试了另一部分代码,它也运行良好:
import org.json4s.{JObject, MonadicJValue}
import org.json4s.jackson.JsonMethods.parse
...
val x: MonadicJValue = JObject()
由于隐式功能未导入此范围,我不知道它是如何工作的!
答案 0 :(得分:2)
我终于得到了帖子Where does Scala look for implicits?
的答案从基于Scala 2.8的“Scala编程,第2版”一书中,我学到了隐含的规则,即 scala编译器将在同伴对象中查找隐式定义。源或目标类型,但我没有得知 scala编译器也会在外部对象中寻找嵌套类型的隐式定义。
在上面的问题中,隐式定义
abs(x) < 0.00001
在包对象implicit def jvalue2monadic(jv: JValue) = new MonadicJValue(jv)
中定义,它是包层结构嵌套org.json4s
/ JValue
或JObject
中的外部对象。因此,在需要时,scala编译器肯定会使用MonadicJValue
。