私はScalaプログラミングの世界の初心者ですが、それが大好きです。最近、私は自分の研究アプリをScalaに移植し始めましたが、まだ苦労していることの1つは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
したがって、明示的なreturnタイプを削除すると、コードは機能しますが、明示的なreturnキーワードがないと、コードをで終了できません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]
}