【问题标题】:How define the result type of this method?如何定义该方法的结果类型?
【发布时间】:2011-06-27 00:24:44
【问题描述】:

以下情况如何定义方法返回类型:

工作代码

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需要结果 输入

【问题讨论】:

  • 太好了,你使用了 Siena + Scala,这是我想尽快做的一件事。我是 Siena 的主要开发人员,我还打算提供一个 Siena4Scala,它可以利用 Scala 的强大功能......我真的对你的经验回报很感兴趣:D

标签: scala playframework siena


【解决方案1】:

看来您需要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 视为最多可以容纳一个元素的容器。包含元素x 的选项是Some(x)。空选项是None。 Option 有几个有用的方法,包括上面使用的mapgetOrElse 方法。

map 方法将一个函数应用于“容器”的每个元素。当然,如果容器是None,它什么也不做(除了可能改变选项的静态类型)。在您的情况下(假设delete 返回一个布尔值),map 方法会将 Option[Class] 更改为 Option[Boolean]。

getOrElse 方法返回选项的元素(如果有),否则返回默认值(在这种情况下为false)。

请注意,您还可以使用PartialFunction 中定义的condOpt 方法来简化您的实现:

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
}

【讨论】:

    【解决方案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 的两种可能选择。此方法的调用者将需要检查返回值(可能也使用模式匹配)以确定该方法返回的是 Class 还是 Boolean。

    【讨论】:

      【解决方案3】:

      看来您没有在正确的位置关闭括号。你是这个意思吗?

      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()
        }    
      } 
      

      看起来您不是在尝试定义递归方法...那么您可能还有其他问题需要解决,因为您需要一个返回 Class[_] 而不是 BooleanClass[_](即Any)。那么这可能会更好吗?

      def getModel(model: String): Class[_] = {
        model match{
          case "menu" => classOf[Menu]
          case "articles" => classOf[Articles]
      } // end method here
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-11-03
        • 1970-01-01
        • 2021-09-02
        • 2012-08-07
        • 2013-09-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多