【发布时间】:2013-03-12 14:31:18
【问题描述】:
我是 Scala 编程世界的新手,但我很喜欢它。最近我开始将我的研究应用程序移植到 Scala 中,而我仍在苦苦挣扎的一件事是 return 关键字。例如在下面的代码中
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
}
在上面的代码中,我收到错误消息:
type mismatch; found : None.type required: om.domain.ContainerMetaData
因此,如果我删除显式返回类型,则代码可以正常工作,但如果没有显式返回关键字,我将无法在 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
}
如果添加返回关键字,编译器会报错
method `readDocument` has return statement; needs result tye
更多信息,这是我正在扩展的特征
trait MongoDAOSerializer[T] {
def createDocument(content:T) : DBObject
def readDocument(db:MongoDBObject) : Option[T]
}
【问题讨论】:
-
我很确定返回类型是
Option[ContainerMetaData],你需要def readDocument(...): Option[ContainerMetaData] = { for...yield... } -
Scala 初学者的规则是“不要使用
return!” -
@RandallSchulz 这个问题根本不是关于
return! -
OP 提到了几次使用它,即使没有代码示例显示它。
标签: scala