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,如果我弄错了,请纠正我)。所以我可以猜测 Play 团队使用小写单例对象名称是因为 Java 兼容性,并且在 Java 变量中使用第一个小写字母编写:

Tyme varName = new Type()

作为以大写字母开头的 defs/vals。例如Async,带有大写字母的 Async 看起来像一些数据的构造函数,您可以通过使用方法创建 some 、单例或仅创建一个带参数的函数来做到这case class Async一点。在异步的情况下,你只需要注意这个计算应该是异步完成的,你不需要一个实际的数据类型,只是它的结果:这是作为一个案例类完成的。object AsyncapplyAsyncResult

当您使用trait. Trait as 本身不能实例化,你可以只写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 回答