Scala错误 - 前向引用扩展了值

时间:2016-03-29 11:42:11

标签: scala

我正在尝试生成从1开始不包含在给定列表中的间隔列表。所以我编写了如下所示的代码:

def comparatorInt(first: (Int,Int), second: (Int, Int)) = first._2 <= second._1

val list1 = List((93,97), (5,10),(15,20),(30,50), (76,90)).sortWith(comparatorInt)

var curr = 1
val res = for(x <- list1; tmp = curr; curr = x._2+1) yield(tmp,x._1-1)

这里我收到编译错误

错误:前向引用扩展了值tmp的定义

lazy val res = for(x < - list1; tmp = curr; curr = x._2 + 1)yield(tmp,x._1-1)

我无法弄清楚问题的解决方法。请提出相同的解决方案。

2 个答案:

答案 0 :(得分:3)

curr理解中的for与您的var不同。你写的相当于

var curr = 1
val res = for(x <- list1; tmp = anotherCurr; anotherCurr = x._2+1) yield(tmp,x._1-1)

因此编译器会在您定义temp之前发现您正在尝试定义anotherCurr,因此会出错。

如果您想修改var,可以在yield操作后执行此操作。

答案 1 :(得分:1)

另一个答案很好地解释了为什么你会收到错误。我只想补充一点:不要使用var,大部分时间都不需要它们。如果你用scala编写,也可以利用语言的强大功能并保持惯用,而不是仅仅用有趣的语法编写相同的旧java代码:) 考虑这样的事情:

  ((0,0) :: list1).foldRight(List.empty[(Int,Int)]) { 
     case(x@(a, b), res@((c, d) :: tail)) if(b < c-1) => x :: (b+1, c-1) :: res 
     case(x, res)  => x :: res
  }.tail

(除了没有导致编译错误,这个版本也可以正常工作,与你的版本不同,它有逻辑错误;))。