Как определить тип результата этого метода? - PullRequest
4 голосов
/ 27 июня 2011

Как определить тип возвращаемого значения метода в следующем случае:

рабочий код

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 требует результата тип

Ответы [ 3 ]

7 голосов
/ 27 июня 2011

Похоже, вам нужен 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 есть несколько полезных методов, включая методы map и getOrElse, использованные выше.

Метод map применяет функцию к каждому элементу «контейнера».Конечно, если контейнер None, он ничего не делает (кроме, возможно, изменения статического типа Option).В вашем случае (при условии, что delete возвращает логическое значение), метод карты изменит Option [Class] на Option [Boolean].

Метод getOrElse возвращает элемент опции, если таковой имеется, и в противном случае возвращает значение по умолчанию (в данном случае false).

Обратите внимание, что вы также можете упростить реализацию, используя метод condOpt, определенный в PartialFunction :

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 голосов
/ 27 июня 2011

Похоже, что getModel иногда будет возвращать класс, а другие - логическое значение. В Scala это обычно моделируется с использованием класса Either :

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

Влево и Вправо представляют два возможных варианта выбора. Вызывающие этот метод должны будут проверить возвращаемое значение (возможно, также используя сопоставление с образцом), чтобы решить, возвращал ли метод класс или логическое значение.

0 голосов
/ 27 июня 2011

Кажется, вы не закрылись с паренсом в нужном месте.Вы имели в виду это?

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

Не похоже, что вы пытаетесь определить рекурсивный метод ... Тогда у вас, вероятно, возникнут другие проблемы, требующие решения, так как вам нужен метод, который возвращает класс[_] не комбинация Boolean и Class[_] (которая будет Any).Так может быть, это будет работать лучше?

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