2012-02-13 20 views
0

我有一個Scala def,它接受來自HTTP POST的參數並解析數據。我從數據庫中提取一個「作業」對象(查詢在調試器中驗證成功,參數與他們需要的一樣),我試圖用新參數更新該作業對象。但是,嘗試分配值是無用的,因爲作業對象保留了所有原始值。如何在Scala中正確設置對象的值?

所有數據庫對象都來自Squeryl。代碼如下:

編輯:添加下面的類和作業對象,以幫助給這個遊戲背景!應用

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 = name然後我得到一個斯卡拉reassignment to val錯誤。嘗試使用var name而不是val 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)'。這不是一個賦值操作符。 'Job'的定義是什麼? – leedm777 2012-02-13 20:21:36

+0

當你說你變成'var name'時,你的意思是在這段代碼中還是在'Job'的定義中? – 2012-02-13 20:23:43

+0

'工作'是一個類和模型在玩!框架。我將在上面的問題中添加該類。 :) – crockpotveggies 2012-02-13 20:23:49

回答

3

job.name是一個不變的屬性,因此你不能用job.name = name改變它的值。你可以在Job類的定義中看到name是用val聲明的,意思是它的值是不可變的,永遠不能改變。 「改變」對象值的唯一方法是實際創建一個全新的實例並丟棄舊的實例。這是處理不可變對象時的標準做法。

將您當地的nameval更改爲var無關緊要,因爲您只能讀取該變量的值。

+0

有趣,謝謝你完全解釋一切!我很難將課程與問題聯繫起來。我改變了班,現在它工作! – crockpotveggies 2012-02-13 20:37:33

0

val是不可變的,在整個Job類是不可變的(因爲所有字段都是)。

可以做什麼是創建一個案例類JobW和一點pimping允許使用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的運動)招聘到的情況下,類包裝,並定義隱式轉換。

使用此隱式轉換(即所謂的pimping),您將有權訪問ok方法,但也可以使用copy方法。

copy方法是在case類中注入的方法,它與case類一樣多的參數作爲字段併產生case類的新實例。所以你現在只能改變你的類的一個值,很簡單,我的意思是,檢索一個新的對象(因爲函數式編程需要不變性)。

相關問題