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