斯卡拉诺布在这里。
这是我简单的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
在这个阶段,不知道该放什么,我想确保我不做一些我不需要做的事情。
答案 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