将'val'类型传递给函数

时间:2013-10-23 11:34:08

标签: function scala

我正在编写一个代码,在其中我声明了一个'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'。它的副本是否被发送到递归函数?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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