6

我试图找出问题所在,并尝试了我在 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 )  ={....}

它将其更改为“任何”。我对这是如何工作的感到困惑。有任何想法吗?非常感激。

4

3 回答 3

9

以下是关于如何解决此类问题的更一般的答案:

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

如果您没有立即看到类型问题,那么有一个简单的技巧可以显式键入您的函数。例如,如果你认为你的函数应该已经返回Int,但编译器不知何故说它找到了 a Unit,它有助于添加: Int到你的函数中。这样,您可以帮助编译器帮助您,因为它会发现函数中的路径返回非Int值的确切位置,这是您首先要寻找的实际问题。

于 2012-04-04T05:51:16.533 回答
8

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

于 2012-04-04T05:24:17.643 回答
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

编译器将根据条件返回的可能结果类型集(匹配、if/else、折叠等),尽其所能应用最具体的类型。

于 2012-04-04T08:34:16.783 回答