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いたのに、どういうわけかコンパイラが を見つけたと言った場合、関数Unitに追加すると役立ち: Intます。このようにして、関数内のパスが値以外を返す正確な場所を見つけるため、コンパイラが支援するのに役立ちます。Intこれは、最初に探していた実際の問題です。

于 2012-04-04T05:51:16.533 に答える
8

値を返したい場合は、等号を追加する必要があります。ここで、関数の戻り値が Any である理由は、2 つの制御パスがあり、それぞれが異なる型の値を返すためです。 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

コンパイラは、条件から返される可能性のある結果の型のセット (match、if/else、fold など) に基づいて、可能な限り具体的な型を適用するために最善を尽くします。

于 2012-04-04T08:34:16.783 に答える