我正在试图弄清楚这个问题,并尝试了我在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 ) ={....}
将其更改为“任意”。我很困惑这是如何工作的。有任何想法吗?非常感谢。
答案 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等)返回的结果类型集应用最具体的类型。