我是scala的新手,对某些语法模糊有点困惑。
我正在写一个喷雾休息服务。要指定自定义对象如何封送到JSON,我创建了以下内容:
object MyJsonProtocol extends DefaultJsonProtocol {
implicit object PersonFormat extends RootJsonFormat[Person] {
def write(p: Person) =JsObject(
"name" -> JsString(p.name),
"fname" -> JsString(p.firstName)
)
def read(value: JsValue) = {
value.asJsObject.getFields("name", "firstName", "age") match {
case Seq(JsString(name), JsString(firstName), JsNumber(age)) =>
new Person(name, firstName, age.toInt)
case Seq(JsString(name), JsString(firstName)) =>
new Person(name, firstName, 0)
case _ => throw new DeserializationException("Person expected: " + value.asJsObject.getFields("name", "firstName", "age").toString)
}
}
}
}
如果我将其包含在我的Akka actor子类的顶部,为什么我需要包含该行
import MyJsonProtocol._
在同一档案中可以看到它吗?通常,import是外部引用,并且可以在没有这些度量的情况下引用与另一个类出现在同一文件中的类或对象。
感谢您的帮助。 富
答案 0 :(得分:2)
你好像混淆了在什么范围内可见的内容:
嵌套对象或类或类可以访问其周围范围的所有val,嵌套类和对象,而不是相反。而且我不懂任何语言,这是不同的。
object Outer {
val foo = "bar"
object Intermediate {
object Innermost {
println(foo)
}
}
}
foo
处于Innermost
的应对之中,因为它嵌套在foo
本身的范围内。然而,
object Outer {
object Intermediate {
object Innermost {
val foo = "bar"
}
}
println(foo)
}
无法工作,因为foo隐藏在嵌套范围的更深处。
让我们改写一下这个例子:
object Intermediate
object Innermost {
val bar = "foo"
}
object Outer {
val interm = Intermediate
val inner = Innermost
println(Innermost.bar)
}
在这种情况下,很明显我们必须如何访问吧。
虽然前面的例子看起来很不一样,但实际上并没有那么不同。要访问' foo'一个人必须深入到它
object Outer {
object Intermediate {
object Innermost {
val foo = "bar"
}
}
println(Intermediate.Innermost.foo)
}
我希望你现在明白为什么你必须深入到MyJsonProtocol.PersonFormat
以便将它放在你的范围内。