4

次の場合、メソッドの戻り型を定義するにはどうすればよいですか。

作業コード

def deleteInstance(model: String, uid: Long) =  model match {
    case "menu" => Model.all(classOf[Menu]).filter("uid", uid).get().delete()
    case "articles" => Model.all(classOf[Articles]).filter("uid", uid).get().delete()
    case "news" => Model.all(classOf[News]).filter("uid", uid).get().delete()
    case "image" =>Model.all(classOf[Image]).filter("uid", uid).get().delete()
    case "files" =>Model.all(classOf[Files]).filter("uid", uid).get().delete()
    case _ => false
  }

動作しないコード:

class ModelManager{
  def getModel(model: String) = {
    model match{
      case "menu" => classOf[Menu]
      case "articles" => classOf[Articles]
      case _ => false
    }

  def deleteInstance(model:String, uid: Long) = {
    Model.all(getModel(model)).filter("uid", uid).get().delete()
  }    
 }
} 

発生したエラーは次のとおりです。

再帰メソッドgetModelには結果タイプが必要です

4

3 に答える 3

7

Optionが必要なようです:

class ModelManager{
   def getModel(model: String) = model match {
      case "menu" => Some(classOf[Menu])
      case "articles" => Some(classOf[Articles])
      case _ => None
   }

   def deleteInstance(model:String, uid: Long) = 
      getModel(model) map { m => 
         Model.all(m).filter("uid", uid).get().delete()
      } getOrElse false
}

Option は、最大で 1 つの要素を保持できるコンテナーと考え​​ることができます。要素を保持する Optionxは ですSome(x)。空のオプションはNoneです。Option には、上で使用したmapおよびgetOrElseメソッドを含む、いくつかの便利なメソッドがあります。

このmapメソッドは、「コンテナ」の各要素に関数を適用します。もちろん、コンテナーが の場合、None何もしません (オプションの静的な型を変更することを除いて)。あなたの場合(deleteブール値を返すと仮定)、map メソッドは Option[Class] を Option[Boolean] に変更します。

このgetOrElseメソッドは、オプションの要素がある場合はそれを返し、そうでない場合はデフォルト値 (falseこの場合) を返します。

PartialFunctioncondOptで定義されたメソッドを使用して、実装を簡素化することもできることに注意してください。

class ModelManager{
   def getModel(model: String) = condOpt(model) {
      case "menu" => classOf[Menu]
      case "articles" => classOf[Articles]
   }

   def deleteInstance(model:String, uid: Long) = 
      getModel(model) map { m => 
         Model.all(m).filter("uid", uid).get().delete()
      } getOrElse false
}
于 2011-06-27T03:42:27.797 に答える
2

getModel はクラスを返す場合もあれば、ブール値を返す場合もあるようです。Scala では、これは通常、Eitherクラスを使用してモデル化されます。

def getModel(model: String) = {
    model match{
      case "menu" => Left(classOf[Menu])
      case "articles" => Left(classOf[Articles])
      case _ => Right(false)
    }

Left と Right は、Either の 2 つの可能な選択肢を表します。このメソッドの呼び出し元は、(おそらくパターン マッチングも使用して) 戻り値を調べて、メソッドがクラスまたはブール値を返したかどうかを判断する必要があります。

于 2011-06-27T03:04:48.113 に答える
0

適切な場所で括弧で閉じていないようです。これのことですか?

class ModelManager{
  def getModel(model: String) = {
    model match{
      // snip
    }
  } // end method here

  def deleteInstance(model:String, uid: Long) = {
    Model.all(getModel(model)).filter("uid", uid).get().delete()
  }    
} 

再帰的なメソッドを定義しようとしているようには見えません...その後、 and の組み合わせではなく Class[_] を返すメソッドが必要になるため、解決すべき他の問題が発生する可能性がありますBoolean(Class[_]これは になりますAny)。それで、これはよりうまくいくでしょうか?

def getModel(model: String): Class[_] = {
  model match{
    case "menu" => classOf[Menu]
    case "articles" => classOf[Articles]
} // end method here
于 2011-06-27T03:28:12.190 に答える