【发布时间】:2013-08-07 08:03:13
【问题描述】:
我正在尝试使用隐式来尝试覆盖我在 ADT 案例类中具有的序列化方法,但是我无法弄清楚应该如何完成
// START OF API//
/**
* Serialize methods defined here
*
*/
object Serializer {
def string(block: (String => String)) = block
def int(block:(Int => String)) = block
def double(block:(Double => String)) = block
}
/**
* These are the DEFAULT serializers
*/
object Implicits {
implicit val string = Serializer.string (s => s)
implicit val int = Serializer.int (i => i.toString)
implicit val double = Serializer.double (d => String.valueOf(d))
}
/**
*
* Our simple ADT defined here
*/
import Implicits._
abstract class Vehicle {
def serialize:String
}
case class Car(s:String) extends Vehicle {
def serialize: String = string(s)
}
case class Truck(i:Int) extends Vehicle {
def serialize: String = int(i)
}
case class RocketShip(d:Double) extends Vehicle {
def serialize: String = double(d)
}
// END OF API
// START OF USER CODE
object UserImplicit {
implicit val string = Serializer.string(s => s.capitalize)
}
object Main extends App{
val v = Car("some car")
println(v.serialize)
import test.UserImplicit._
// This SHOULD print a capatilized version i.e. SOME CAR
println(v.serialize)
}
// END OF USER CODE
基本上我想修改默认的序列化器方法(包含在object Implicits 中的方法),以便 API 的用户可以实现自己的序列化器
我尝试了许多组合(例如在 trait 中使用隐式而不是 object),但实际上我并没有设法让它工作
【问题讨论】:
-
我还是不明白。你想在上面做什么?
-
我基本上是在尝试覆盖序列化程序,我希望 2 个
println(v.serialize)调用打印 2 个不同的字符串,第一个是"some car"",因为它使用的是object Implicits中的版本,并且第二个"SOME CAR",因为它使用UserImplicit中的版本,该版本将字符串大写(即implicit val string = Serializer.string(s => s.capitalize)) -
在 Scala 中的 ADT 应该被编码为
sealed trait结合case objects 和sealed case classes。
标签: scala implicit monkeypatching abstract-data-type