-1

斯卡拉菜鸟在这里。

这是我的简单 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

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

4

2 回答 2

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

于 2012-12-31T22:07:36.983 回答
1

返回 Scala 函数中的最后一个值。显式返回不是必需的。

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

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

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

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

 def forExampleStoreValues: IndexedSeq[Int] = {
   for{i <- 1 to 5 if i % 2 == 0}  yield i;    
 }
于 2012-12-31T22:13:17.287 回答