Scala:在对象或 class 中定义隐式函数

Scala : Define implicit functions in an object or in a class

我正在学习 Play2 框架并开始使用隐式函数。我正在将一些 Position 对象转换为 Json :

implicit val locationWrites = new Writes[Position] {
    def writes(position: Position) = Json.obj(
      "lat" -> position.lat,
      "lon" -> position.lon
    )
}

我应该怎么做:

object JsonConversion {
  implicit val locationWrites = new Writes[Position] {
    def writes(position: Position) = Json.obj(
      "lat" -> position.lat,
      "lon" -> position.lon
    )
  }
}

或者我应该这样做:

class JsonConversion {
  implicit val locationWrites = new Writes[Position] {
    def writes(position: Position) = Json.obj(
      "lat" -> position.lat,
      "lon" -> position.lon
    )
  }
}

然后在将使用这些隐式函数的地方导入这个classobject

这些隐式函数在实例和可扩展性方面的根本区别是什么,例如,如果它们以并发方式调用?

只需将您的隐式方法放入一个对象中并以这种方式导入它:

import JsonConversion._

从性能的角度来看,您不必担心,因为可以执行许多调用而没有副作用。

也不是。有一种更简洁的方法可以将您的所有域放在一起,这也是人们通常容易忘记的。 你可以在伴随对象中隐含

这里才是真正应该放置它们的地方:

class Position { ... }
object Position {
  implicit val positionWrites = new Writes[Position] {
    def writes(position: Position) = Json.obj(
    "lat" -> position.lat,
    "lon" -> position.lon
    )
  }
}

默认情况下,隐式解析将查看伴生对象。这样就不会出现域名散乱的情况,不会出现满是JSON格式的怪异文件。您可以将事物保持在正确的位置,并且如果您更新 类.

就很容易知道哪里需要更改。

附带说明一下,Play 使用一些有趣的宏生成更高级的 JSON 格式。您可以使用 Json.format[Type]Json.writes[Type] 或只是 Json.reads[Type] 来简单地生成您需要的格式,而无需手动操作。

implicit val positionFormat = Json.format[Position]