我是 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._
要在同一个文件中看到它吗?通常导入是外部引用,并且可以引用与另一个类出现在同一文件中的类或对象,而无需此类措施。
感谢您的帮助。 丰富
最佳答案
您似乎混淆了范围内可见的内容:
嵌套对象或类或类可以访问其周围范围的所有 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
才能将其纳入您的范围内。
关于Scala 在同一文件中导入对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32658226/