期待从for循环返回的Vector

时间:2012-12-31 22:05:23

标签: scala for-loop yield

斯卡拉诺布在这里。

这是我简单的for循环

  def forExampleStoreValues = {
    println(">>forExampleStoreValues");
    val retVal = for{i <- 1 to 5 if i % 2 == 0}  yield i;
    println("retVal=" + retVal);    
  }

我的期望是,当我调用它时,最后一个val将自动返回。但是,当我从main中调用它时,

object MainRunner {
  def main(args: Array[String]){
    println("Scala stuff!");  // println comes from Predef which definitions for anything inside a Scala compilation unit. 
    runForExamples();
  }

  def runForExamples() {
    val forLE = new ForLoopExample(); // No need to declare type.
    println("forExampleStoreValues=" +forLE.forExampleStoreValues)  
  }
}

输出结果为:

>>forExampleStoreValues
retVal=Vector(2, 4)
forExampleStoreValues=()

然后我试着明确地返回retval。

  def forExampleStoreValues = {
    println(">>forExampleStoreValues");
    val retVal = for{i <- 1 to 5 if i % 2 == 0}  yield i;
    println("retVal=" + retVal);    
    return retval;
  }

这给出了:

method forExampleStoreValues has return statement; needs result type

所以我将函数签名更改为:

 def forExampleStoreValues():Vector 

给出:

Vector takes type parameters

在这个阶段,不知道该放什么,我想确保我不做一些我不需要做的事情。

2 个答案:

答案 0 :(得分:4)

您不需要明确的回报。将始终返回方法中的最后一个表达式。

def forExampleStoreValues = {
  println(">>forExampleStoreValues")
  val retVal = for{i <- 1 to 5 if i % 2 == 0}  yield i
  println("retVal=" + retVal)  
  retVal
}

这也意味着如果您使用println(...)结束方法,则会返回()类型的Unit,因为这是println的返回类型。如果你做了一个明确的返回(通常是因为你想提前返回),你需要指定结果类型。结果类型为Vector[Int],而非Vector

答案 1 :(得分:1)

返回Scala函数中的最后一个值。明确的回报是没有必要的。

您的代码可以简化为for表达式返回由编译器推断的IndexSeq[Int]

def forExampleStoreValues = {
  for{i <- 1 to 5 if i % 2 == 0}  yield i;    
}

scala>forExampleStoreValues
res0: scala.collection.immutable.IndexedSeq[Int] = Vector(2, 4)

表达式for{i <- 1 to 5 if i % 2 == 0} yield i;返回实现特征Vector[Int]的{​​{1}}实例。因此,要手动指定类型,您可以将IndexedSeq添加到IndexedSeq[Int]表达式。

for