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
)
}
}
然后在将使用这些隐式函数的地方导入这个class
或object
。
这些隐式函数在实例和可扩展性方面的根本区别是什么,例如,如果它们以并发方式调用?
只需将您的隐式方法放入一个对象中并以这种方式导入它:
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]
我正在学习 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
)
}
}
然后在将使用这些隐式函数的地方导入这个class
或object
。
这些隐式函数在实例和可扩展性方面的根本区别是什么,例如,如果它们以并发方式调用?
只需将您的隐式方法放入一个对象中并以这种方式导入它:
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]