这是我的代码:
package controllers
import play.api._
import play.api.mvc._
import play.api.data.Form
import play.api.data.Forms.tuple
import play.api.data.Forms.text
object Application extends Controller {
def index = Action {
Ok(views.html.index("Your new application is ready."))
}
val form = Form(
tuple(
"name" -> text,
"address" -> text,
"x_card_num" -> text
)
)
def payment = Action { implicit request =>
def values = form.bindFromRequest.data
def name = values("name")
//val card_num = ""
//values.isDefinedAt("x_card_num")
if (values.get("x_card_num") == None) {
val card_num = "test"
} else {
//def card_num = values("x_card_num")
val card_num = "test2"
}
//val card_num = "test"
Ok(views.html.payment("testing",name,card_num))
}
}
它不起作用。它只是完全跳过if(values.get(“x_card_num”)== None)和else语句,而card_num最终为空字符串,如if else语句之前所定义。
为什么它会完全忽略if else语句?
如何检查数组“值”中是否存在密钥?
答案 0 :(得分:4)
这里的问题是你是阴影外部范围。也就是说,您声明名为card_num
的多个值。
if (values.get("x_card_num") == None) {
val card_num = "test"
// ^^^
// this is a new variable declaration in a different scope
}
else
val card_num = "test2"
在scala中,一切都是表达式,所以你可以这样做:
val card_num = if (values.get("x_card_num") == None) "test" else { ... }
也就是说, if-block 本身会计算出一个值(只要有else
)
另一种选择是使用变量而不是值,但这不是惯用的(你应该避免使用var
):
var card_num = null
if ( .. )
card_num = "test"
// ^^^
// Notice no val or var here
您可以使用isDefinedAt
来简化测试
val cardNum = if (values isDefinedAt "x_card_num") "test2" else "test"