Scala 在同一文件中导入对象

标签 scala spray

我是 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/

相关文章:

scala - 在 Scala 中无条件返回字符串

scala - 为什么scala中for循环的每次迭代参数是val而不是var

scala - 如何在查询参数中喷射解码列表

scala - 基于请求内容类型的不同路由 Spray Routing 1.2.1

http - 如何使喷雾 jar 客户端遵循重定向

java - 为什么这些函数删除后类型相同?

Eclipse 靛蓝 : how do I uninstall a plugin if the Help -> About Eclipse SDK dialog won't display?

scala - 无法使用 spray-json 反序列化通用集合

scala - akka http、字符集 header 、utf-8 问题

Scala 尴尬包含行为