2016-12-05 9 views
0

現在、私は抽象クラスを抽象クラスに拡張し、抽象クラスを拡張した3つのケースクラスと戻り値の型を持つ関数を持っています。この関数では、ある条件が満たされたときには、型の戻り値が返されますが、何らかの理由で型の不一致が検出された場合、ユニット:必須、例:if/elseステートメントでオブジェクト型を返すScala

なぜ、私は理解できません。主な機能に...各if文の終わりに

abstract class example 
case class type1() extends example 
case class type2() extends example 
case class type3() extends example 

def func(): example = { 

if (condition) 
return (val x= type1()) 

else if (condition) 
return (val x= type2()) 

else if (condition) 
return (val x= type3()) 
} 

を例型を返す、私はあなたが戻った後

+0

注: 'return'はこのようにScalaでは使用されず、通常は[使用されません](https://tpolecat.github.io/2014/05/09/return.html)です。 Scalaの 'return'はJavaと同じではありません! –

答えて

3

括弧の種類は一例ではありません()FUNCを呼んでいます。

return (val x= type1()) 

でも意味をなさない:あなたはxが特定の価値を持っていると言っている...そして、この事実を返す。だから、もしあなたの削除「valがX =」(とにかく、無用であること)、あなたが得る:

「型TYPE1の新しいオブジェクトを作成することによって、私は指定された値を返す」という意味
return type1() 

さらに、Scalaの命名規則を遵守する必要があります。具体的には、クラス名はラクダ文字でなければなりません。

abstract class Example 
case class Type1() extends Example 
case class Type2() extends Example 
case class Type3() extends Example 

さらに、同じ条件を何度か評価して、それを行う理由はありません。したがって、関数の定義方法を簡素化する必要があります。また、明示的なリターンを使用しないでください。以下のような何か:条件は常にfalse常に真か、またはので、

また
def func(): example = if (condition) Type1() 
         else Type2() 

、それに注意してくださいは、あなたの元のコード、タイプ2とタイプ3のオブジェクトにインスタンス化されることはありません。

最後に、この関数の動作はの条件に依存しているため、関数の副作用があります。これはそのパラメータの1つではありません。あなたはそうしてはいけません。結論として

、あなたのソースコードは、おそらくのように見えるはずです:あなたが最後に「他にあれば」の後に他のブロックを実装するのを忘れ

abstract class Example 

case class Type1() extends Example 
case class Type2() extends Example 
case class Type3() extends Example 

def func(condition: Boolean): Example = if(condition) Type1() 
             else Type2() 
+0

あなたはすべてのポイントを詳しく教えていただけますか? –

+0

私は自分の答えを要求どおりに具体化しようとしました。 – mgoeminne

+0

ケースクラスに値がまったくない場合は、代わりにケースオブジェクトにする必要があります。 – Jesper

0

Scalaのメソッドは、bodyと条件付きbrachの最後の式の値を返します。それ以外のblockはUnitの型を持ちます。したがって、エラー。

関連する問題