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

时间:2016-07-29 22:08:27

标签: scala concurrency playframework-2.0 instance implicit

我正在学习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,其中将使用这些隐式函数。

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

2 个答案:

答案 0 :(得分:1)

两者都不是。有一种更清洁的方法可以将您的所有域名保持在一起,以及人们通常会忘记的内容。 您可以将隐含置于随播对象

这是你应该真正把它们放在哪里:

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]

答案 1 :(得分:0)

只需将隐式方法放在对象中,然后以这种方式导入:

import JsonConversion._

从性能的角度来看,您不应该有任何顾虑,因为可以执行许多调用而没有任何副作用。