【问题标题】:Scala Errors- forward reference extends over definition of valueScala Errors-前向引用扩展了值的定义
【发布时间】:2016-03-29 11:42:10
【问题描述】:

我正在尝试从 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

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

【问题讨论】:

  • 你应该接受另一个答案。实际答案是..

标签: scala


【解决方案1】:

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

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

所以编译器看到您在定义 anotherCurr 之前尝试定义 temp,因此出现错误。

如果要修改var,可以在yield操作后进行。

【讨论】:

  • IntelliJ 有一个很好的代码分析器,可以很容易地找到这类事情。我是 Eclipse 的老用户,但 IntelliJ 更适合 Scala。
【解决方案2】:

另一个答案很好地解释了您收到错误的原因。我只是想补充一点:不要使用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

(除了不会导致编译错误之外,此版本也可以正常工作,与您的版本不同,它存在逻辑错误;))。

【讨论】:

  • 非常感谢,这正是我所需要的。我还是 Scala 的新手,所以尽可能多地学习......将尝试继续您的建议。 :)
  • 如果你能推荐一些链接来学习 scala 的高级功能,这将非常有帮助,否则我只有在尝试解决某些问题时才知道这些方法。
猜你喜欢
  • 2015-10-15
  • 1970-01-01
  • 2018-01-21
  • 1970-01-01
  • 2011-10-15
  • 1970-01-01
  • 1970-01-01
  • 2016-05-08
  • 2016-03-03
相关资源
最近更新 更多