2012-02-13 4 views
0

HTTP POST에서 매개 변수를 가져 와서 데이터를 구문 분석하는 Scala def가 있습니다. 데이터베이스에서 "작업"개체를 가져오고 있습니다 (쿼리가 디버거에서 확인 된대로 성공적으로 수행되었으며 매개 변수가 필요합니다). 새 매개 변수로 해당 작업 개체를 업데이트하려고합니다. 그러나 작업 객체가 모든 원래 값을 유지하므로 값을 할당하려고하면 쓸모가 없습니다.스칼라에서 객체의 값을 올바르게 설정하는 방법은 무엇입니까?

모든 데이터베이스 개체는 Squeryl에서 가져온 것입니다. 아래 코드 :

편집 : 아래 클래스를 추가하고이 Play에서 컨텍스트를 제공하는 데 도움이되는 Job 개체! 응용 프로그램

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 오류가 발생합니다. 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 클래스는 불변입니다 (모든 필드가 있으므로).

copy을 사용할 수 있도록 케이스 클래스 JobW과 약간의 포주를 만드는 것이 가능합니다. 즉 말했다 :

내가 무슨 짓을했는지
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 메서드는 사례 클래스에 주입 된 메서드로, 사례 클래스만큼 많은 인수를 필드로 사용하고 사례 클래스의 새 인스턴스를 생성합니다.

이제는 하나의 값만 변경할 수 있습니다. 간단히 말해서, 새로운 객체를 검색 할 수 있습니다 (변경 불가능 성을위한 함수형 프로그래밍).

관련 문제