4

ときどき、boot.scala または Boot.scala ファイルを含むプロジェクトを見かけます。これは厳格で迅速な Scala ルールではないように見えますが、Boot.scala ファイルを含めることは一種の民間伝承のようです。いくつかのプロジェクト。この特定のプロジェクトでは、アクター パターンと REST サービスに変換される Akka と Spray を使用します。

そのようなファイルで通常期待できる機能の種類と、これが一般的なパターンであるかどうかを誰かが説明してくれますか?

この質問の延長として (最初の部分に最初に答えてください :-)、複数の 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)

}

1 つのパッケージが他のパッケージに依存していること、および 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 プロジェクトに比べて) ため、規約が設定されている可能性があります。

他の質問については、 cake patternself typesを読んでください。例えば

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

から継承するクラスまたはトレイトにWebのみ混合できるトレイトを定義し、それらを self 型の一部として持つトレイトを定義します。したがってAPICore

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

}

Apiトレイトが必要なため、トレイトが混在していない場合は型チェックを行いませんWeb

于 2012-08-16T11:18:46.650 に答える