2015-09-23 18 views
11

Ich habe das folgende Stück CodeMustervergleich auf Tupel in Kotlin

fun changeSelection(item: FileOrFolder, selected: Boolean) { 
    selection = when(item) { 
     is Folder -> { 
      when(selected) { 
       true -> selection + item 
       false -> selection - item 
      } 
     } 
     is File -> { 
      when(selected) { 
       true -> selection + item 
       false -> selection - item 
      } 
     } 
     else -> throw Exception("unreachable") 
    } 
} 

, die für mich ein bisschen unübersichtlich sieht aus, als ich in scala

def changeSelection(item: FileOrFolder, selected: Boolean) { 
    (item, selected) match { 
     case (item: Folder, true) => selection + item 
     case (item: Folder, false) => selection - item 
     case (item: File, true) => selection + item 
     case (item: File, false) => selection - item 
    } 
} 

dazu gewöhnten Gibt es eine Möglichkeit zu erreichen, etwas ähnliches in Kotlin?

+0

Die Logik scheint nicht von der Art des "Gegenstands" abhängig zu sein. Wenn dies der Fall ist, sollten Sie es wahrscheinlich erwähnen oder das Codebeispiel ändern. –

Antwort

12

Nun, für Scala willen, können Sie schreiben:

fun changeSelection(item: FileOrFolder, selected: Boolean) { 
    selection = when { 
     item is Folder && selected -> selection + item 
     item is Folder && !selected -> selection - item 
     item is File && selected -> selection + item 
     item is File && !selected -> selection - item 
     else -> throw Exception() 
    } 
} 

Eine Straight-Forward-Version wäre:

fun changeSelection(item: FileOrFolder, selected: Boolean) { 
    selection = if(selected) 
     when(item) { 
      is Folder -> selection + item 
      is File -> selection + item 
      else -> throw Exception() 
     } 
    else 
     when(item) { 
      is Folder -> selection - item 
      is File -> selection - item 
      else -> throw Exception() 
     } 
} 

Aber ich ziehe auf jeden Fall:

operator fun Selection.plus(f: FileOrFolder) = ... 
operator fun Selection.minus(f: FileOrFolder) = ... 

fun changeSelection(item: FileOrFolder, selected: Boolean) { 
    if(selected) 
     selection += item 
    else 
     selection -= item 
} 
+0

@Yaroslav, welche Option haben Sie verwendet (von den drei oben genannten)? Nur neugierig: D – voddan

+0

der erste, der dritte ist auch nett – Yaroslav