我正在尝试生成从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)
我无法弄清楚问题的解决方法。请提出相同的解决方案。
答案 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
(除了没有导致编译错误,这个版本也可以正常工作,与你的版本不同,它有逻辑错误;))。