gpt4 book ai didi

Scala 选项返回类型

转载 作者:行者123 更新时间:2023-12-04 23:24:24 27 4
gpt4 key购买 nike

我是 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
}

如果添加 return 关键字,则编译器会提示
method `readDocument` has return statement; needs result tye

更多附加信息,这是我要扩展的特征
trait MongoDAOSerializer[T] {
def createDocument(content:T) : DBObject
def readDocument(db:MongoDBObject) : Option[T]
}

最佳答案

问题是,您缺少 yield for-comprehension 中的关键字。还有 None最后是不必要的,因为 for-comprehension 会产生 None ,如果缺少其中一个值并且显式创建 Some在理解中不需要,因为它会创建一个 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)
}
}

关于Scala 选项返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15364059/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com