Scala检查数组中是否存在密钥

时间:2012-06-27 17:11:27

标签: scala playframework

这是我的代码:

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语句?

如何检查数组“值”中是否存在密钥?

1 个答案:

答案 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"