2012-02-13 24 views
0

私は、HTTP POSTからパラメータを受け取り、データを解析するScala defを持っています。私はデータベースから "ジョブ"オブジェクトを取得しています(クエリはデバッガで検証され、パラメータは必要なだけです)、新しいパラメータでそのジョブオブジェクトを更新しようとしています。しかし、ジョブオブジェクトがすべての元の値を保持しているため、値を割り当てようとすると役に立たないことがわかります。Scalaでオブジェクトの値を正しく設定する方法は?

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

編集:以下のクラスを追加し、このPlayでコンテキストを与えるのに役立つJobオブジェクト!私がしようとした場合job.name -> name何も起こりませんし、私はjob.name = nameを試みるならば、私はスカラ座reassignment to valエラーを取得するためのアプリ

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) 
    } 
} 

は私が困惑します。 val nameの代わりにvar nameを試したときに同じエラーが発生します。

これは明らかに私の側で構文の問題ですが、これを処理する正しい方法は何ですか?ありがとう!

詳細情報:これが役立つ場合、ここでは私たちのプレイで使用されるジョブクラスです!アプリ:あなたはjob.name = nameでその値を変更することはできませんので

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] { 
} 
+0

'x - > y'はタプル'(x、y) 'を作成します。代入演算子ではありません。 「ジョブ」の定義は何ですか? – leedm777

+0

'var name'に変更すると言うと、このコードや' Job'の定義で意味しますか? –

+0

'ジョブ(Job)'は演劇中のクラスとモデルです!フレームワーク。上記の質問にクラスを追加します。 :) – crockpotveggies

答えて

3

job.nameは、不変のプロパティです。 Jobクラスの定義でnamevalと宣言されています。これはその値が変更不可能であることを意味します。 jobオブジェクトの値を「変更」する唯一の方法は、実際に完全に新しいインスタンスを作成し、古いインスタンスを破棄することです。これは、不変オブジェクトを扱う際の標準的な習慣です。

ローカルnamevalからvarに変更することは、その変数の値のみを読み込んでいるため問題ではありません。

+0

です。すべて!クラスを問題に結びつけるのが難しかった。私はクラスを変更し、今それは動作します! – crockpotveggies

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")) 

何、ケースクラスラッパーに(運動のためspimplified)仕事をラップし、暗黙の型変換を定義することです。

暗黙の変換(いわゆるポンピング)を使用すると、okメソッドにアクセスできますが、copyもアクセスします。

copyメソッドは、ケースクラスと同じ数の引数をフィールドとして取り込み、ケースクラスの新しいインスタンスを生成するケースクラスに注入されます。

クラスの値を1つだけ変更することができました。非常に簡単に言えば、新しいオブジェクトを取得することができます(不変性のための関数型プログラミングとして)。

関連する問題