4

有时我会看到包含 boot.scala 或 Boot.scala 文件的项目。虽然这似乎不是一个硬性的 Scala 规则,但在其中包含一个 Boot.scala 文件似乎是一种民间传说一些项目。这个特定的项目使用 Akka 和 Spray,它们可以转换为 Actor 模式和 REST 服务。

有人能解释一下在这样的文件中通常可以预期什么类型的功能,如果这是一种常见的模式?

作为这个问题的扩展(请先回答第一位 :-),我很高兴知道如何阅读此代码,该代码位于具有多个 Boot.scala 文件的项目中。

Web 包中的 Boot.scala:

trait Web {
  this: Api with Core =>
....
}

api 包中的 Boot.scala:

trait Api {
  this: Core =>
....
}

核心包中的 Boot.scala:

trait Core {
  implicit def actorSystem: ActorSystem
  implicit val timeout = Timeout(30000)

  val application = actorSystem.actorOf(
    props = Props[ApplicationActor],
    name = "application"
  )

  Await.ready(application ? Start(), timeout.duration)

}

可以得出一个包依赖于另一个包,并且 Boot.scala 文件可能是基于角色的系统中的常见现象,但是如何“读取”关系呢?例如,我如何用英文阅读 trait Web {this: Api with Core =>...}?

在特定实例中,应用程序的起点位于主文件中:

object Main extends App {
  implicit val system = ActorSystem("RESTService")

  class Application(val actorSystem: ActorSystem) extends Core with Api with Web {

  }

  new Application(system)

  sys.addShutdownHook {
    system.shutdown()
  }

}

我意识到我的问题对某些人来说似乎微不足道,但我正试图在这里进入 Scala 部落,并且“秘密密码”不在任何手册中。

4

1 回答 1

5

我不知道 Boot.scala 是否是一个常见的模式,但它是在 Lift 中使用的,并且包含了应用程序的主要配置。由于 Lift 相当古老(相对于其他 scala 项目),它可能已经设定了一个约定。

对于另一个问题,您应该阅读蛋糕图案自我类型。例如

trait Web {
  this: Api with Core =>
....
}

定义了一个特征,该特征Web只能混合到继承自或将其作为其自身类型的一部分的类或特征APICore。因此

class Application(val actorSystem: ActorSystem) extends Core with Api with Web {

}

如果Api没有混入特征,则不会进行类型检查,因为它是Web特征所必需的。

于 2012-08-16T11:18:46.650 回答