Scala 在同一文件中导入对象
Scala Import of Object in Same File
我是 scala 的新手,对某些语法 mojo 有点困惑。
我在写喷休息服务。为了指定自定义对象如何编组到 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 subclass 的顶部,为什么我需要包含行
import MyJsonProtocol._
为了在同一个文件中看到它?通常导入是外部引用,并且 class 或与另一个 class 出现在同一文件中的对象可以在没有此类措施的情况下被引用。
感谢您的帮助。
富有
您似乎混淆了在什么范围内可见的内容:
嵌套对象或 类 或 类 可以访问所有 val、嵌套 类 及其周围范围的对象,而不是相反。而且我不懂任何语言,这哪里不一样。
object Outer {
val foo = "bar"
object Intermediate {
object Innermost {
println(foo)
}
}
}
foo
在 Innermost
的 cope 中,因为它嵌套在 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)
}
在这种情况下,很明显我们必须如何访问 bar。
尽管前面的示例看起来很不一样,但实际上并没有那么大的不同。要访问 'foo' 必须深入研究
object Outer {
object Intermediate {
object Innermost {
val foo = "bar"
}
}
println(Intermediate.Innermost.foo)
}
我希望您现在明白为什么必须深入研究 MyJsonProtocol.PersonFormat
才能将其包含在您的范围内。
我是 scala 的新手,对某些语法 mojo 有点困惑。
我在写喷休息服务。为了指定自定义对象如何编组到 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 subclass 的顶部,为什么我需要包含行
import MyJsonProtocol._
为了在同一个文件中看到它?通常导入是外部引用,并且 class 或与另一个 class 出现在同一文件中的对象可以在没有此类措施的情况下被引用。
感谢您的帮助。 富有
您似乎混淆了在什么范围内可见的内容:
嵌套对象或 类 或 类 可以访问所有 val、嵌套 类 及其周围范围的对象,而不是相反。而且我不懂任何语言,这哪里不一样。
object Outer {
val foo = "bar"
object Intermediate {
object Innermost {
println(foo)
}
}
}
foo
在 Innermost
的 cope 中,因为它嵌套在 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)
}
在这种情况下,很明显我们必须如何访问 bar。
尽管前面的示例看起来很不一样,但实际上并没有那么大的不同。要访问 'foo' 必须深入研究
object Outer {
object Intermediate {
object Innermost {
val foo = "bar"
}
}
println(Intermediate.Innermost.foo)
}
我希望您现在明白为什么必须深入研究 MyJsonProtocol.PersonFormat
才能将其包含在您的范围内。