我是Scala编程世界的新手,但喜欢它.最近我开始将我的研究应用程序移植到Scala中,而我仍在努力的一件事就是返回关键字.例如,在下面的代码中
def readDocument(dbobj:MongoDBObject) = Option[ContainerMetaData]
{
for(a <- dbobj.getAs[String]("classname");
b <- dbobj.getAs[Long]("id");
c <- dbobj.getAs[Long]("version");
d <- dbobj.getAs[String]("description");
e <- dbobj.getAs[String]("name");
f <- dbobj.getAs[String]("tag");
g <- dbobj.getAs[Int]("containertype");
h <- dbobj.getAs[Date]("createddate")
)
{
val ctype = ContainerType(g)
val jodadt = new DateTime(h)
val data = new ContainerMetaData(a,b,c,d,e,f,ctype,jodadt)
Some(data)
}
None
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码中我收到错误消息:
type mismatch; found : None.type required: om.domain.ContainerMetaData
Run Code Online (Sandbox Code Playgroud)
因此,如果我删除显式返回类型代码工作,但没有显式返回关键字我无法终止我的代码Some(data).
def readDocument(dbobj:MongoDBObject)=
{
for(a <- dbobj.getAs[String]("classname");
b <- dbobj.getAs[Long]("id");
c <- dbobj.getAs[Long]("version");
d <- dbobj.getAs[String]("description");
e <- dbobj.getAs[String]("name");
f <- dbobj.getAs[String]("tag");
g <- dbobj.getAs[Int]("containertype");
h <- dbobj.getAs[Date]("createddate")
)
{
val ctype = ContainerType(g)
val jodadt = new DateTime(h)
val data = new ContainerMetaData(a,b,c,d,e,f,ctype,jodadt)
Some(data)
}
None
}
Run Code Online (Sandbox Code Playgroud)
如果添加一个return关键字,那么编译器会抱怨
method `readDocument` has return statement; needs result tye
Run Code Online (Sandbox Code Playgroud)
更多的额外信息,这是我扩展的特点
trait MongoDAOSerializer[T] {
def createDocument(content:T) : DBObject
def readDocument(db:MongoDBObject) : Option[T]
}
Run Code Online (Sandbox Code Playgroud)
问题是,你yield在for-comprehension 中缺少关键字.并且None最后也是不必要的,因为None如果其中一个值缺失并且Some不需要在理解中明确创建a,那么for-comprehension将会产生,因为它将创建一个Option无论如何.您的代码看起来像这样(未经测试)
def readDocument(dbobj: MongoDBObject): Option[ContainerMetaData] = {
for {
a <- dbobj.getAs[String]("classname")
b <- dbobj.getAs[Long]("id")
c <- dbobj.getAs[Long]("version")
d <- dbobj.getAs[String]("description")
e <- dbobj.getAs[String]("name")
f <- dbobj.getAs[String]("tag")
g <- dbobj.getAs[Int]("containertype")
h <- dbobj.getAs[Date]("createddate")
} yield {
val ctype = ContainerType(g)
val jodadt = new DateTime(h)
new ContainerMetaData(a,b,c,d,e,f,ctype,jodadt)
}
}
Run Code Online (Sandbox Code Playgroud)