0

我在方法中有以下代码:

aSides.foreach(as => as.side.terr match
{
  case r: TerrSRiver => paintSeq :+= ((g: Graphics2D) =>
    {
      g.setPaintColour(ColourInt.blue)
  g.fill(Polygon(as.paintStd(0.2)))
    }
  case _: TerrSCoast => paintSeq :+= ((g: Graphics2D) =>
    {
      g.setPaintColour(TerrSea.colour)
      g.fill(Polygon(as.paintStd(0.2)))
    }) //one case excluded for simplicity

paintSeq 在方法外声明

var paintSeq: Seq[Graphics2D => Unit] = Nil

这将按预期编译和运行。但是,如果我在第一种情况下添加 if 语句:

case r: TerrSRiver => paintSeq :+= ((g: Graphics2D) =>
  {
    g.setPaintColour(ColourInt.blue)
    g.fill(Polygon(as.paintStd(0.2)))
    if (zoom > 50) g.setPaintColour(ColourInt.white)
  }

我收到一个错误:

类型不匹配; 找到:Seq[swing.Graphics2D => Any] 需要:Seq[swing.Graphics2D => Unit] AreaESw.scala /prStratSw/src/pGrid/pUISw 第 49 行 Scala 问题

该错误与paintSeq :+= 方法有关。为什么 if 语句返回 Any 而不是 Unit?我可以通过在 if 语句后添加一行来消除错误:

val dummy = 0

但是,如果我在最后添加返回单元:

case r: TerrSRiver => paintSeq :+= ((g: Graphics2D) =>
  {
    g.setPaintColour(ColourInt.blue)
    g.fill(Polygon(as.paintStd(0.2)))
    if (zoom > 50) g.setPaintColour(ColourInt.white)
    return Unit
  }

它编译时出现以下警告:

封闭方法 setVisObjs 具有结果类型 Unit:返回值被丢弃

但是当它运行时出现以下错误

线程“AWT-EventQueue-0”中的异常 scala.runtime.NonLocalReturnControl$mcV$sp

使用“return()”仍然会产生运行时异常。

这是 Scala Swing 代码,但我在 JavaFx Eclipse 下载中使用 Scala 2.10.3:Linux 上的 4.2.2。

4

2 回答 2

2

如果的类型

的结果类型是andif (cond) expr的常见基类型,就像exprUnitif (cond) { expr } else { () }

请参阅什么是if语句的返回类型?详情。

如何获得单位

要获取类型的实例,Unit您应该使用()文字:

if (zoom > 50) g.setPaintColour(ColourInt.white)
()

Unitvalue 是 type 的伴随对象Unit。它不是 type 的实例Unit。对象的类型UnitUnit.type

不要return在 lambda 中使用

lambda 的结果是 lambda 主体中最后一条语句的结果,因此您可以将结果值(在本例中为 literal ())添加为最后一行。

returnNonLocalReturnControlin lambda 将使用异常( )从周围的方法返回,而不是从 lambda 本身返回。

它对于像这样的 java 风格的方法很有用:

def firstNegative(seq: Seq[Int]): Option[Int] = {
  for {
    i <- seq
  } if (i < 0) return Some(i)

  return None
}

if (i < 0) return Some(i)这是 lambda 身体。此方法的等效代码:

def firstNegative(seq: Seq[Int]): Option[Int] = {
  seq.foreach{ i =>
    if (i < 0) return Some(i)
  }

  return None
}
于 2014-01-28T12:39:41.503 回答
0

你应该有一个 else 子句:

   if (zoom > 50) g.setPaintColour(ColourInt.white) else ...

贝努瓦

于 2014-01-28T12:33:34.820 回答