3

Play Framework のソース コードの一部を以下に示します。

package play.api.mvc
trait Results extends java.lang.Object {
  def $init$() : scala.Unit = { /* compiled code */ }

  def Async(promise : scala.concurrent.Future[play.api.mvc.Result]) : play.api.mvc.AsyncResult = { /* compiled code */ }
  val Ok : Results.this.Status = { /* compiled code */ }
  val Created : Results.this.Status = { /* compiled code */ }
  val Accepted : Results.this.Status = { /* compiled code */ }
//.......................

なぜ彼らは名前valdef大文字で始めるのだろうか?

さらに、一部のクラスとオブジェクトは小文字で始まります。

package views.html.play20

object book extends BaseScalaTemplate[play.api.templates.Html, play.templates.Format[play.api.templates.Html]] with play.api.templates.Template1[scala.Seq[scala.Predef.String], play.api.templates.Html] {
  def apply(pages : scala.Seq[scala.Predef.String]) : play.api.templates.Html = { /* compiled code */ }
  //.............
}

package views.html.play20

object manual extends play.templates.BaseScalaTemplate[play.api.templates.Html, play.templates.Format[play.api.templates.Html]] with play.api.templates.Template3[scala.Predef.String, scala.Option[scala.Predef.String], scala.Option[scala.Predef.String], play.api.templates.Html] {
  def apply(title : scala.Predef.String, main : scala.Option[scala.Predef.String], sidebar : scala.Option[scala.Predef.String]) : play.api.templates.Html = { /* compiled code */ }
 //............
}

package views
package object xml extends java.lang.Object {
}
4

1 に答える 1

1

免責事項として、私は Java で書いたり、プロジェクトで Play を使用したりしていません。

オブジェクトに関しては。OOP の観点からすると、Scala のファースト クラス オブジェクトは、Java のシングルトン パターンでインスタンス化されたオブジェクトにすぎません (私は Java を使用していません。間違っている場合は訂正してください)。したがって、Java との互換性のために小文字のシングルトン オブジェクト名を使用している Play チームと、Java 変数では最初の小文字で記述されていると推測できます。

Tyme varName = new Type()

大文字で始まる defs/vals として。たとえばAsync、大文字の Async はデータのコンストラクターのように見えます。これは、メソッドcase class Asyncでシングルトンを作成するか、引数を取る関数を作成することで実行できます。Async の場合、この計算は非同期で行う必要があることに注意する必要があります。これには実際のデータ型は必要ありません。それは結果だけです。これはケース クラスとして行われます。object AsyncapplyAsyncResult

また、このトリックは、すべてを でモデル化するときに、scala の機能的な方法で使用できますtrait。Trait 自体をインスタンス化することはできnew Sometrait {}ません。美しいとは言えませんが、メソッドを追加することはできます。

trait Welcome {
  def welcome: String
}

def Welcome(name: String) = new Welcome {
  def welcome = s"Welcome! $name"
}

これは、オブジェクトを作成するより伝統的な方法です。

この規則の本当の理由については、Play チームの誰かだけが答えられると思います。

于 2013-09-26T06:24:22.827 に答える