2016-08-05 20 views
0

私はScalaの初心者です。私はスカラーのif-elseブロックを使って "Int"を返そうとしていました。スカラーのanyValの代わりにif-elseブロックからIntを返す方法は?

私のコードは次のlikie何かになります:私は方法setBlockNumber()にこの値blockNumberを使用

val blockNumber = { 
    if(x.getName equals ("NATIVE")) 0 
    else { 
     if(x.getName equals ("DATIVE")) 1 
    } 
} 

を、これは問題が発生した場所:

new setBlockNumber(Option(blockNumber)) 

をしかし、毎回私はこの方法を実行しよう

type mismatch; found : AnyVal required: Int 

C誰かが私の間違いを指摘してどうすればいいですか?事前にお時間をいただきありがとうございます。

+2

'x.getName'が' 'NATIVE ''でも '' DATIVE "'でもない場合、どんな価値がありますか? – Dogbert

+0

これは何もするべきではありません。私はvalが空でなければならないことを意味します – Goldengirl

+2

'blockNumber'に関して"空 "とは何ですか?空の数字とは何ですか? –

答えて

12

のコメントを読んだ後、私は何をしたいことはblockNumberOption[Int]を格納することであると信じて:

val blockNumber = if (x.getName == "NATIVE") { 
    Some(0) 
} else if (x.getName == "DATIVE") { 
    Some(1) 
} else { 
    None 
} 

new setBlockNumber(blockNumber) 

私もmatchを使用して、これを書き直します:

val blockNumber = x.getName match { 
    case "NATIVE" => Some(0) 
    case "DATIVE" => Some(1) 
    case _ => None 
} 
new setBlockNumber(blockNumber) 
+0

はい、または**マップ**のpingを 'Map'に入れ、' get x.getName' ... xD(equalsが唯一の条件である場合) –

+0

これは興味深い考えです。しかし、それはかなり誤解を招く可能性があります。私はマッチの解決策がかなり合っていると思う。 – sascha10000

0

私はなぜclearifyしたいですIntの代わりにAnyValが得られます。私は攻撃的ではないことを望んでいませんが、あなたもプログラミングに新しい人のようです...?

あなたのコードがあなたの望むことをすると仮定すると、2番目のIfは本当に感覚的ではありません。 1つは書くでしょう:

val blockNumber = { 
     if(x.getName equals ("NATIVE")) 0 
     else if(x.getName equals ("DATIVE")) 1 
    } 

これはまだAnyValです。 "NATIVE"または "DATIVE"のいずれかが一致しない場合、コンパイラはどの値を渡すかわからないため、Unitです。 UnitとIntの共通のスーパータイプはAnyValです。

不足しているパスを持つだからあなたのコードに:

val blockNumber = { 
    if(x.getName equals ("NATIVE")) 0 
    else { 
     if(x.getName equals ("DATIVE")) 1 
     else Unit 
    } 
} 

ですから、お互いにネストされ、基本的には2 if文を持っています。最初のものは、x.getNameの値が "NATIVE"であり、もう1つが、デフォルトまたは他のすべての場合を処理するための通常のelseパスであるかどうかを尋ねます。しかし、ユニット内で解決される他のパスがなければ、別のパスを入れます。既に述べたように、IntとUnitの共通のスーパータイプはAnyValです。あなたが書くことができる唯一の2例「NATIVE」と「与格」を持つという仮定の下で

val blockNumber = if(x.getNmae equal ("NATIVE")) 0 
else 1 

をそれ以外の場合は@Dogbertのマッチケースのアプローチが移動するための方法です。ケースが起こらない可能性がある場合は、Optionを@Dogbertのように使用する必要があります。そうでない場合、少なくとも1つのケースが一致する場合、オプションなしでIntを使用することができます。

親切に、助けてください!

関連する問題