我在 Play Framework 的 Scala 控制台中玩耍,它看起来像是在以某种方式进行隐式转换,而在范围内没有任何隐式定义:
scala> import play.api.libs.json._
import play.api.libs.json._
scala> :implicits
No implicits have been imported other than those in Predef.
scala> Json.arr _
res0: Seq[play.api.libs.json.Json.JsValueWrapper] => play.api.libs.json.JsArray = <function1>
scala> Json.arr(1,2,3)
res1: play.api.libs.json.JsArray = [1,2,3]
如您所见, 的输出:implicits
显示范围内唯一的隐式转换是来自scala.Predef
. 但是,当我将Int
值 (1,2,3)play.api.libs.json.Json.JsValueWrapper
传递给Json.arr()
.
我的印象是隐式转换仅在隐式转换在范围内时应用(即,它在当前范围内声明或导入)。那么这种转变是如何发生的呢?
更新:我认为 Play 控制台必须在做某事,因为即使我打开一个新控制台并进行简单分配(根本没有导入),转换也会发生:
scala> val x: play.api.libs.json.Json.JsValueWrapper = 1
x: play.api.libs.json.Json.JsValueWrapper = JsValueWrapperImpl(1)