在Scala中保持方法之间的类型信息

时间:2013-09-19 15:40:25

标签: scala type-safety

这是我的问题:如果某些谓词适用,我有一大堆对象,我想要应用程序(我称之为“编译器”)。为清楚起见,我想将谓词函数与过程分开;但是在很多情况下,谓词可能非常复杂,并构建了我想在后一个过程函数中重用的信息。

我按如下方式定义编译器:

trait Compiler[A] {
  def mtch(o: SourceObject): Option[A]
  def proceed(o: SourceObject, data: A): Unit
}

如何调用编译器:

val compilers: Seq[Compiler[_]]
val objects: Seq[SourceObject]

for (o <- objects; c <- compilers; data <- c.mtch(o)) {
  c.proceed(o, data)
}

也就是说,如果mtch函数返回Some(data),则会调用proceed方法,并附加data。但是,我无法编译它,因为我在管理编译器时不知道数据的类型。

此外,我有一些实际上并不需要任何数据的情况。在我当前的状态中,我有匹配器返回Some(null),它很臭。

1 个答案:

答案 0 :(得分:5)

改为使用与路径相关的类型。取代

trait Compiler[A] {
  def mtch(o: SourceObject): Option[A]
  def proceed(o: SourceObject, data: A): Unit
}

trait Compiler {
  type A
  def mtch(o: SourceObject): Option[A]
  def proceed(o: SourceObject, data: A): Unit
}

一切都会奏效。

这里的诀窍是,你的理解中data的类型变为c.A,这是c.proceed期望作为其第二个参数的类型。

对于null,make编译器不需要传递参数type A = Unit,因此如果它继续,则返回Some(())