2012-04-04 6 views
5

私はこの問題を解明しようとしており、Scalaで読んださまざまなスタイルを試しましたが、どれもうまくいきませんでした。私のコードは次のとおりです。私のScala関数は、最後の行ではなくUnit型を返すのはなぜですか?

.... 

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) ={....} 

"どれか"。私はこの仕組みが混乱しています。何か案は?とても有難い。

+1

+1については、newbは常に直面します。説明もややインパクトのあるものです。 – aitchnyu

答えて

8

値を返す場合は、等号を追加する必要があります。関数の戻り値がAnyの理由は、2つの制御パスを持ち、それぞれが異なる型の値を返すことです.1はifの条件が満たされたとき(戻り値がtemp)、もう1つがifの条件が満たされていない場合(戻り値はb = b + 1、またはbがインクリメントされた後に戻ります)。

+0

ifが満たされない場合、戻り値はb = b + 1になるのはなぜですか?しかし、私はあなたが何を意味するかを見ます。 Javaではそれはそうではないので、スケーラには他のケースも含まれていると考えるのは奇妙です。 – Andy

+0

なぜb = b + 1なのか心配しないでください。それは理にかなっている。私はここで違ったフォーマットをしていたので、私はそれを私のエディタで見ると意味がありました。正しい方向に私を指してくれてありがとう! – Andy

+0

まず、ifの条件が満たされない場合に関数から返される値を決定する必要があります。次にifの前にその値を "使用"するか、else節を追加してそこに置くことができます。 –

9

は、ここに1つは、このような問題にアプローチする方法については一般的な答えです:

あなたがあなたの頭に機能し、を書くこと時々起こるが、それはタイプXを返すと仮定しますが、どこかの道コンパイラは同意しません。これはほとんどの場合、関数が書かれたばかりなので、コンパイラは実際のソース(関数が呼び出される行を指しています)を渡しませんが、通常は関数の戻り値の型が問題であることがわかります。

すぐに型の問題が表示されない場合は、関数を明示的に入力する簡単なトリックがあります。たとえば、関数がIntを返すはずでしたが、何らかの形でコンパイラがUnitを見つけたとすれば、: Intを関数に追加するのに役立ちます。こうすることで、関数内のパスが最初に探していた実際の問題であるIntの値を返す、正確な場所を見つけることができるので、コンパイラの助けになります。

+0

ありがとうございます。はい、私はそれを試みましたが、それでも私にエラーを与えました。私はそれが問題であったかもしれないと思ったが、少なくとも私の問題ではそれを解決しなかった。間違いなく助けになったであろう他の状況に関して。私は言語に慣れていないし、入力に感謝する。 – Andy

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 

コンパイラが、それは結果タイプの可能なセットに基づくことができる最も具体的なタイプは、条件(一致、/それ以外であれば、倍など)から返さ適用するために最善を尽くします。

関連する問題