0

我正在编写一个代码,在该代码中我声明了一个“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' 是一个变量,它最终是从 'from' 到 'until' 的日期列表。好吧,事实证明它有效。应该不对吧?因为“dateSeq”变量已被初始化为“val”。是否将其副本发送到递归函数?

4

2 回答 2

2

并不是将 的副本dateSeq传递给calculateDatesRecur,而是表达式dateSeq :+ date创建一个新的Seq[Date](使用新添加的日期,并且不修改dateSeq参数),然后将其传递给递归调用。通过这种方式,final是从连续的不可变的中间值构建的,并最终在子句执行Seq[Date]时交回。else

于 2013-10-23T11:46:43.017 回答
0

dateSeq :+ date返回新对象。检查 :+ 方法的定义:http ://www.scala-lang.org/api/current/index.html#scala.collection.Seq

于 2013-10-23T11:45:11.690 回答