我是使用Scala的Play Framework新手。我想评估一个条件,并且在那个条件下评估为true,我想发送一个响应并在那时退出。但是,我正在尝试的下面的代码一直持续到最后。
我尝试用return
语句打破 - 但是,我得到了类型不匹配。有人可以帮我解决这个问题吗?
def hello = Action { request =>
if (true) {
Ok("in If")
// Return at this point
}
print("This line should not be printed")
Ok("final")
}
修改
假设正在使用4个参数进行GET调用 - name
,age
,married
,spouse
。我想确保传入所有3个参数(name
,age
,married
),如果married
为真,请检查spouse
是否通过如果此验证失败,我想回复说Bad Request
。否则,继续逻辑。我怎么写这个?
答案 0 :(得分:1)
以下是另一种方法:
case class QueryInput(name: String, age: Int, married: Boolean, spouse: Option[String]) {
def validated = if(married && spouse.isEmpty) None else Some(this)
}
def validateInput(request: RequestHeader) = {
val input = for {
name <- request.queryString.get("name").flatMap(_.headOption)
age <- request.queryString.get("age").flatMap(_.headOption.flatMap(a=>Try(a.toInt).toOption))
married <- request.queryString.get("married").flatMap(_.headOption.map(_=="true"))
} yield {
QueryInput(name, age, married, request.queryString.get("spouse").flatMap(_.headOption))
}
input.flatMap(_.validated)
}
def hello() = Action { request =>
validateInput(request) match {
case Some(input) => Ok(input.toString())
case None => BadRequest
}
}
事实上,有很多选择。您还可以使用Either类进行验证:左值可累积错误并返回错误请求,右值可构建已验证的输入。
答案 1 :(得分:0)
我的建议是有一个验证参数的方法。然后执行一个简单的if / else来检查参数是否有效并返回成功或一般错误。
如果你真的想要一个特定的
答案 2 :(得分:0)
你可以这样做,通过返回Ok,但实际上,这不是scala方式。你想要做的是改变你的思维方式,把一切都想象成一个功能。如果你不知道,if-then-else总是返回一个值。例如,您实际上可以这样写:
def hello = Action { request =>
val result = if (true) {
Ok("foo")
} else {
Ok("bar")
}
result
}
当然,更加scala的方式是使用匹配器
def hello = Action { request =>
val result = true match {
case true => Ok("foo")
case _ => Ok("bar")
}
result
}
更进一步,你根本不需要指定结果对象,因为scala根据返回/创建的最后一个对象计算出返回的对象。
def hello = Action { request =>
true match {
case true => Ok("foo")
case _ => Ok("bar")
}
}
编辑:要回答OP的编辑,您仍然希望使用匹配器。假设你的vals是选项,那么你会做什么:
def hello(nameOpt:Option[String], ageOpt:Option[String], marriedOpt:Option[String]) = Action { request =>
(nameOpt, ageOpt, marriedOpt) match {
case (Some(name), Some(age), Some(married)) => Ok("all 3 are given")
case (Some(name), Some(age), _) => Ok("all 2 are given")
// functionally same as above
// case (Some(name), Some(age), None) => Ok("all 2 are given")
// some combination of the above
case (None, None, Some(married)) => Ok("married but no name or age")
// default case
case _ => Ok("bar")
}
}
答案 3 :(得分:0)
第一件事:
当块计算时,它的所有表达式和声明按顺序处理,然后块返回最后一个表达式的值作为它自己的值。
第二:don't use return。
第三个是Play Framework解决问题的方法:action composition。虽然我不会说这是微不足道的。