为什么我的Scala函数返回类型Unit而不是最后一行?

时间:2012-04-04 05:19:29

标签: function scala

我正在试图弄清楚这个问题,并尝试了我在Scala上阅读的不同样式,但它们都不起作用。我的代码是:

....

val str = "(and x y)";

def stringParse ( exp: String, pos: Int, expreshHolder: ArrayBuffer[String], follow: Int )  

    var b = pos; //position of where in the expression String I am currently in
    val temp = expreshHolder; //holder of expressions without parens
    var arrayCounter = follow; //just counts to make sure an empty spot in the array is there to put in the strings

    if(exp(b) == '(') {
        b = b + 1;

        while(exp(b) == ' '){b = b + 1} //point of this is to just skip any spaces between paren and start of expression type

        if(exp(b) == 'a') {
               temp(arrayCounter) = exp(b).toString; 
               b = b+1; 
               temp(arrayCounter)+exp(b).toString; b = b+1; 
               temp(arrayCounter) + exp(b).toString; arrayCounter+=1}
               temp;

         }

}

val hold: ArrayBuffer[String] = stringParse(str, 0, new ArrayBuffer[String], 0);
for(test <- hold) println(test);

我的错误是:

Driver.scala:35: error: type mismatch;
found   : Unit
 required: scala.collection.mutable.ArrayBuffer[String]
ho = stringParse(str, 0, ho, 0);
                ^one error found

当我在方法声明中的参数之后添加等号时,如下所示:

def stringParse ( exp: String, pos: Int, expreshHolder: ArrayBuffer[String], follow: Int )  ={....}

将其更改为“任意”。我很困惑这是如何工作的。有任何想法吗?非常感谢。

3 个答案:

答案 0 :(得分:9)

以下是关于如何处理此类问题的更一般性答案:

有时您会编写一个函数并且在脑中假设它返回类型X,但在某个地方,编译器不同意。这几乎总是在刚刚编写函数时发生,因此虽然编译器没有给你实际的源代码(它指向调用函数的行),但通常知道函数的返回类型是问题所在。 / p>

如果您没有立即看到类型问题,可以使用显式键入函数的简单方法。例如,如果您认为您的函数应该已返回Int,但编译器发现它找到Unit,则有助于将: Int添加到您的函数中。这样,您可以帮助编译器帮助您,因为它会发现确切位置,函数中的路径返回非Int值,这是您首先要查找的实际问题。

答案 1 :(得分:8)

如果要返回值,则必须添加等号。现在,函数返回值为Any的原因是你有2个控制路径,每个控制路径返回一个不同类型的值 - 1表示满足if条件(返回值为temp),另一个是when如果条件不是(并且返回值将是b = b + 1,或者在增加之后为b)。

答案 2 :(得分:0)

class Test(condition: Boolean) {

  def mixed = condition match {
    case true  => "Hi"
    case false => 100
  }

  def same = condition match {
    case true  => List(1,2,3)
    case false => List(4,5,6)
  }

  case class Foo(x: Int)
  case class Bar(x: Int)

  def parent = condition match {
    case true  => Foo(1)
    case false => Bar(1)
  }
}
val test = new Test(true)

test.mixed   // type: Any
test.same    // type List[Int]
test.parent  // type is Product, the case class super type

编译器将尽力根据条件(match,if / else,fold等)返回的结果类型集应用最具体的类型。