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

sca*_*1sk 2 scala type-safety

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

我定义了一个编译器如下:

trait Compiler[A] {
  def mtch(o: SourceObject): Option[A]
  def proceed(o: SourceObject, data: A): Unit
}
Run Code Online (Sandbox Code Playgroud)

如何调用编译器:

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

for (o <- objects; c <- compilers; data <- c.mtch(o)) {
  c.proceed(o, data)
}
Run Code Online (Sandbox Code Playgroud)

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

此外,我有一些我实际上不需要任何数据的情况.在我目前的状态,我有匹配返回Some(null),这很臭.

Dan*_*ral 5

改为使用与路径相关的类型.更换

trait Compiler[A] {
  def mtch(o: SourceObject): Option[A]
  def proceed(o: SourceObject, data: A): Unit
}
Run Code Online (Sandbox Code Playgroud)

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

一切都会奏效.

这里的技巧是data你的理解c.A中的类型变成了,这是类型c.proceed期望的第二个参数.

至于nullmake make编译器不需要传递参数type A = Unit,所以Some(())如果它继续进行则返回.