-1

これが私のコードです:

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)and elseステートメントを完全にスキップするだけで、if elseステートメントの前に定義されているように、card_numは空の文字列になります。

ifelseステートメントを完全に無視するのはなぜですか?

そして、キーが配列「値」に存在するかどうかを確認するにはどうすればよいですか?

4

1 に答える 1

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 ブロック自体が値に評価されます ( がある限りelse) 。

もう 1 つのオプションは、valuesではなく変数を使用することですが、これは慣用的ではありません ( sを避ける必要があります)。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"
于 2012-06-27T17:19:45.303 に答える