4

私は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]
}
4

1 に答える 1

8

問題は、yieldfor-comprehensionにキーワードがないことです。また、値の1つが欠落している場合、また、とにかく作成されるため、理解にaを明示的に作成する必要がない場合はNone、for-comprehensionが生成されるため、最後にatは不要です。あなたのコードはこのように見える必要があります(テストされていません)NoneSomeOption

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)
  }
} 
于 2013-03-12T14:38:53.350 に答える