24

私は scala の初心者で、このサンプル コードを実行しようとしています。

 def isLast(c: Int, r: Int):Int ={
   if(r == 1)
   {
   return 1;
   }

  else if (r == c){
   return 1
    }
   }

しかし、それは私にコンパイル時エラーを与えます

Multiple markers at this line
- type mismatch;  found   : Unit  required: Int
- type mismatch;  found   : Unit  required: Int

親切に私を助けてください。また、scala を学習するための良いサイトを教えてください。

4

4 に答える 4

32

まず、コードを少し整理しましょう。

def isLast(c: Int, r: Int):Int = {
  if(r == 1)
    return 1
  else if (r == c)
    return 1
  // but what about when r is neither 1 nor c ??
}

つまり、 が 1 の場合は 1 を返し、 が の場合rは 1 を返すように scala に伝えています。これr == cで問題ありません。ただし、メソッドが Int を返すようにする場合は、すべての場合に 1 つを返す必要があります。rScalaは、 が 1 でも でもない場合に返される Int がわからないため、不平を言いcます。

修正は、else他の Int を返すよりも句を追加することです。

追加のメモとして、returnここでキーワードを省略できますし、省略すべきです。これにより、関数本体の最後の式として、if-else 式の結果が返される必要があることを Scala に暗黙的に認識させることができます。

def isLast(c: Int, r: Int):Int = {
  if(r == 1)
    1
  else if (r == c)
    1
  else
    0 // or some other Int
}

最後に、名前が で始まる関数がある場合、isおそらくブール値を返す必要があります。つまり、入力が last の場合はtrue を返し、それ以外の場合は false を返します。

于 2012-09-24T17:36:51.973 に答える
15

1の代わりに戻ろうとしていると思われますtrue。しないでください。そうではない。

あなたのロジックは次のとおりです。

def isLast(c: Int, r: Int): Boolean = r == 1 || r == c

: Boolean型注釈はオプションです。ここでは、右側の短い式とメソッドの名前から戻り値の型が非常に明白であるため、省略しても問題ありません。1 行で十分な場合は、10 行のコードを使用しないでください。

于 2012-09-24T18:08:30.043 に答える
3

「else」句はなく、「else if」だけなので、関数が整数を返すことは保証されていません。両方の条件に該当する場合は、何も返されません。これは、"Unit" の戻り値の型です。明示的に言う必要がありますelse 0

于 2012-09-24T17:37:01.567 に答える