2013-10-23 28 views
0

我正在一個代碼中,我聲明的「VAL」型變量,並將其傳遞給一個遞歸函數,其改變它:過客「VAL」類型的函數

def calculateDates(from: LocalDate, until: LocalDate, by: RDate, holidays: HolidayCalendar): Seq[LocalDate] = 
{ 
    val dateSeq: Seq[LocalDate] = Seq(from) 
    def calculateDatesRecur(from: LocalDate, dateSeq: Seq[LocalDate]): Seq[LocalDate] = 
    { 
     val date = by(from, holidays) 
     if (date.compareTo(until) <= 0) 
      calculateDatesRecur(date, dateSeq :+ date) 
     else 
      dateSeq 
    } 
    calculateDatesRecur(from, dateSeq) 
} 

「dateSeq」是一個變量最終是從'從'到'直到'的日期列表。那麼,事實證明它的工作原理。它不應該對嗎?因爲'dateSeq'變量已被初始化爲'val'。它是否將其副本發送到遞歸函數?

回答

2

這並不是說的dateSeq副本被傳遞到calculateDatesRecur,相反,表達dateSeq :+ date創建一個新的Seq[Date](與新添加的日期,並無需修改dateSeq參數) ,然後傳遞給遞歸調用。通過這種方式,最後的Seq[Date]由連續的不可變中間值構建,並且在執行else子句時最終返回。