Scala Option返回类型
发布时间:2020-12-16 09:49:54 所属栏目:安全 来源:网络整理
导读:我是 Scala编程世界的新手,但喜欢它.最近我开始将我的研究应用程序移植到Scala中,而我仍在努力的一件事就是返回关键字.例如,在下面的代码中 def readDocument(dbobj:MongoDBObject) = Option[ContainerMetaData] { for(a - dbobj.getAs[String]("classname")
我是
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 } 在上面的代码中我收到错误消息: type mismatch; found : None.type required: om.domain.ContainerMetaData 因此,如果我删除显式返回类型代码工作,但没有显式返回关键字我无法终止我的代码在某些(数据). 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,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] } 解决方法
问题是,你在for-comprehension中缺少yield关键字.并且最后的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,jodadt) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |