如何使用多语句的收益率?

时间:2011-12-15 08:52:56

标签: scala for-loop yield

该代码仅用于说明目的,即它是示例而非实际代码。

我试过了:

val results = for(i <- 1 to 20)
{
  val x = i+1
  println(x)
  yield x
}

和这个

val results = for {i <- 1 to 20;
  val x = i+1;
  println(x)
}
  yield x

但这一切都不起作用 - 我需要一个生成器,定义和一个声明 - 这可以用yield来实现吗?如果是,那么正确的语法是什么?

2 个答案:

答案 0 :(得分:8)

希望这会让你开始:

  val result = for (i <- 1 to 10 if i%2==0) yield {
     println(i); 
     i
  }

相当于

 (1 to 10).filter(_%2==0).map(x => { println(x); x } )

答案 1 :(得分:3)

您似乎认为Scala中的for与命令式语言中的for类似。不是!在幕后,它使用flatMapfor/yield语法的第一部分中的每个表达式都必须具有某种形式。如果我没有弄错的话,它必须是一个赋值(限于val,可能)或<-表达式。你可以破解它以获得你想要的东西:

for {
  i <- 1 to 20
  val x = i + 1
  _ <- {println(x); List(1)}
} yield x

但这太可怕了。正如贾米尔所证明的那样,攻击yield也是一种可能性,但也非常可怕。

问题是,你究竟想要完成什么? foreach最适用于副作用循环代码:

(1 to 10) foreach { i =>
  val x = i+1
  println(x)
}

map最适合用于生成相同长度的新列表:

(1 to 10) map (i => i + 1)

想要同时做两件事是相当不寻常的,有点难看。