2016-08-05 21 views
0

Ich bin ein Neuling in Scala. Ich habe versucht, einen if-else-Block in scala zu verwenden, um zu versuchen, ein "Int" zurückzugeben.Wie Int aus einem If-Else-Block anstelle von AnyVal in Scala zurückgegeben wird?

Mein Code sieht etwas likie dies:

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

ich diesen Wert verwenden blockNumber in dem Verfahren setBlockNumber() und dies, wo das Problem auftritt:

new setBlockNumber(Option(blockNumber)) 

Aber jedes Mal wenn ich versuche, diese Methode zu tun gibt einen Fehler an:

type mismatch; found : AnyVal required: Int 

C eine Person bitte zeigen Sie meinen Fehler und wie kann ich es korrigieren? Vielen Dank für Ihre Zeit im Voraus.

+2

Welchen Wert möchten Sie, wenn 'x.getName' weder' "NATIVE" noch "DATIVE" 'ist? – Dogbert

+0

Es sollte dann nichts. Ich meine, das val sollte leer sein. – Goldengirl

+2

Was ist "leer" in Bezug auf 'blockNumber'? Was ist eine leere Nummer? –

Antwort

12

Nach dem Lesen der Kommentare, glaube ich, was Sie wollen speichern ist ein Option[Int] in blockNumber:

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

new setBlockNumber(blockNumber) 

Ich würde auch diese match mit umschreiben:

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

Ja, oder einfach die ** map ** Pings in eine 'Map' und rufen Sie' get x.getName' ... xD (wenn gleich ist die einzige Bedingung natürlich) –

+0

Es ist eine interessante Idee . Aber es könnte ziemlich "missverständlich" sein. Ich denke, die Match-Lösung ist ziemlich passend. – sascha10000

0

Ich möchte nur clearify warum Sie erhalten AnyVal anstelle von Int. Ich möchte nicht beleidigend sein, aber es scheint, als wärst du auch neu im Programmieren ...?

Unter der Annahme, dass Ihr Code tun würde, was Sie wollen, ist Ihre zweite If nicht wirklich sinnvoll. Man würde schreiben:

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

Das ist immer noch AnyVal. Weil in dem Fall, wenn entweder "NATIVE" oder "DATIVE" nicht übereinstimmen, der Compiler nicht weiß, welchen Wert Sie liefern werden und daher ist es Unit. Der gemeinsame Supertyp von Unit und Int ist AnyVal.

So Ihr Code mit fehlenden Pfaden:

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

So haben Sie grundsätzlich 2 If-Statements in ineinander verschachtelt. Der erste fragt, ob der Wert von x.getName "NATIVE" ist und der andere ist ein allgemeiner else-Pfad, der normalerweise für die Behandlung des Standardfalls oder aller anderen Fälle verwendet wird. Aber du bringst einen anderen hinein, ohne einen anderen Weg, der sich in Einheit auflösen würde. Wie bereits erwähnt, ist der gemeinsame Supertyp von Int und Unit AnyVal.

Unter der Annahme, nur 2 Fälle „NATIVE“ und „Dativ“ haben könnten Sie schreiben:

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

Ansonsten ist das Spiel-Fall-Ansatz von @Dogbert ist der Weg zu gehen. Wenn die Möglichkeit besteht, dass keiner der Fälle auftritt, sollten Sie Option wie @Dogbert verwenden. Andernfalls, wenn mindestens einer Ihrer Fälle übereinstimmt, können Sie Int ohne Option verwenden.

Mit freundlichen Grüßen, hoffe es hilft!