0

HTTP POST からパラメーターを取得してデータを解析する Scala def があります。データベースから「ジョブ」オブジェクトを取得しています (デバッガーで検証されたクエリは成功し、パラメーターは必要なとおりです)。そのジョブ オブジェクトを新しいパラメーターで更新しようとしています。ただし、ジョブ オブジェクトは元の値をすべて保持するため、値を割り当てようとしても無駄です。

すべてのデータベース オブジェクトは Squeryl のものです。以下のコード:

編集:以下のクラスと Job オブジェクトを追加して、この Play でコンテキストを提供するのに役立ちます! アプリ

object Job {
  def updateFromParams(params:Params) = {
    val job = Job.get( params.get("job_id").toLong ).get

    val comments =  params.get("comments")
    val startTime = parseDateTime(params.get("start_time") + " " + params.get("date"))
    val endTime = parseDateTime(params.get("end_time") + " " + params.get("date"))
    val clientId = params.get("client_id").toLong
          val client = Client.get(clientId).get
    val name = params.get("job_name")
    val startAddressType = params.get("start_address_type")
    var startLocationId:Option[Long] = None
    val (startAddress, startCity, startProvince) = startAddressType match {
      case "client" => getClientAddress(clientId)
      case "custom" => (params.get("start_custom_address"),
                params.get("start_custom_city"),
                params.get("start_custom_province"))
      case id => {
      startLocationId = Some(id.toLong)
        getLocationAddress(startLocationId.get)
      }
    }

    job.comments ->  comments
    job.startTime -> startTime
    job.endTime -> endTime
    job.clientId -> clientId
    job.name -> name
    job.startAddressType -> startAddressType
    job.startAddress -> startAddress
    job.startCity -> startCity
    job.startProvince -> startProvince


    Job.update(job)
  }
}

job.name -> name試してみても何も起こらず、試してみるとjob.name = nameScalareassignment to valエラーが発生するので困惑しています。var nameの代わりに試してみると、同じエラーが発生しますval name

これは明らかに私の側の構文の問題です。これを処理する適切な方法は何ですか? ありがとう!

詳細情報:これが役立つ場合は、Play で使用される Job クラスを次に示します。アプリ:

class Job(
  val id: Long,

  @Column("name")
  val name: String,

  @Column("end_time")
  val endTime: Timestamp,

  @Column("start_time")
  val startTime: Timestamp,

  @Column("client_id")
  val clientId: Long,

  @Column("start_address_type")
  var startAddressType:String,

  @Column("start_address")
  var startAddress: String,
  /* LOTS MORE LIKE THIS */
) extends KeyedEntity[Long] {
}
4

2 に答える 2

3

job.nameは不変のプロパティであるため、 で値を変更することはできませんjob.name = name。で宣言されているJobクラスの定義で確認できます。つまり、その値は不変であり、変更することはできません。オブジェクトの値を「変更」する唯一の方法は、まったく新しいインスタンスを実際に作成し、古いインスタンスを破棄することです。これは、不変オブジェクトを扱うときの標準的な方法です。namevaljob

その変数の値を読み取るだけなので、ローカルnameを からvalに変更してvarも問題ありません。

于 2012-02-13T20:33:04.287 に答える
0

valは不変であり、脂肪ではJobクラス全体が不変です(すべてのフィールドが不変であるため)。

できることは、ケースクラスJobWと少しのポン引きを作成して、の使用を許可することです copy。それは言った:

class Job(val id:Long, val name:String) {}

case class JobW(override val id:Long, override val name:String) extends Job(id, name){
  def ok:String = name + id
}

implicit def wrapJob(job:Job):JobW = JobW(job.id, job.name)

val job:Job = new Job(2L, "blah")

println(job.ok)

println(job.copy(name="Blob"))

私が行ったことは、(演習用に簡略化された)ジョブをケースクラスラッパーにラップし、暗黙的な変換を定義することです。

この暗黙の変換(いわゆるポン引き)を使用すると、okメソッドだけでなくメソッドにもアクセスできますcopy

このcopyメソッドは、ケースクラスに挿入されたものであり、フィールドと同じ数の引数を取り、ケースクラスの新しいインスタンスを生成します。

つまり、クラスの1つの値のみを変更し、新しいオブジェクトを取得することができるようになりました(関数型プログラミングは不変性の引数として)。

于 2012-02-13T21:10:12.363 に答える