我不时会看到有一个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文件可能是基于actor的系统中的常见视图,但是如何“读取”关系?例如,我如何用英语阅读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部落,并且“秘密密码”不在任何手册中。
答案 0 :(得分:5)
我不知道Boot.scala是否是一种常见模式,但它在Lift中使用并包含应用程序的主要配置。由于Lift相当陈旧(相对于其他scala项目),它可能已经设置了一个约定。
对于其他问题,您应该阅读cake pattern和self types。例如
trait Web {
this: Api with Core =>
....
}
定义了一个特征Web
,它只能混合到从API
和Core
继承的类或特征中,或者将它们作为自我类型的一部分。因此
class Application(val actorSystem: ActorSystem) extends Core with Api with Web {
}
如果Api
特征未混入,则不会键入检查,因为Web
特征需要它。