2016-03-29 19 views
0

我试图生成未包含在从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的定义

懒惰VAL解析度=为(X < - list1的; TMP = C URR; curr = x._2 + 1)yield(tmp,x._1-1)

我无法找出问题的解决方法。请建议同样的解决方案。

回答

1

另一个答案很好地解释了为什么你会得到这个错误。我只是想补充:不要使用var,大多数时候你并不需要它们。如果你在写阶还不如充分利用语言的力量,保持习惯,而不是仅仅写老的Java代码与滑稽的语法:) 考虑这样的事情:

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

(除了不导致编译错误,这个版本也正常工作,不像你的那样,有逻辑错误;))。

+0

非常感谢,这正是我所需要的。 我对斯卡拉还是一个新手,所以尽可能多地学习...会尽量继续提供您的建议。 :) –

+0

这将是非常有益的,如果你可以建议一些链接指向学习scala的高级功能,否则我只有在尝试解决某些问题时才会了解这些方法。 –

2

for理解中的curr与您的var不一样。你所写的是相当于

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

所以编译器看到你正在试图定义temp你定义anotherCurr之前,因此错误。

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

+0

IntelliJ有一个很好的代码分析器,可以很容易地找到这类事情。我是一个长期的Eclipse用户,但IntelliJ对Scala来说更好。 – Phasmid