2015-09-23 16 views
11

Mam następujący fragment koduWzorzec dopasowania na krotki w 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") 
    } 
} 

która wygląda trochę zagracone dla mnie jak przyzwyczaiłem się do tego w 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 
    } 
} 

Czy istnieje sposób, aby osiągnąć coś podobnego w Kotlin?

+0

logiki nie wydaje się w ogóle zależeć od typu elementu. Jeśli tak, prawdopodobnie powinieneś o tym wspomnieć lub zmodyfikować próbkę kodu. –

Odpowiedz

12

No na litość Scala, można napisać:

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() 
    } 
} 

Bardziej wersja prosta byłoby:

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() 
     } 
} 

Ale ja zdecydowanie wolę:

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, z której opcji skorzystałeś (z powyższych trzech)? Po prostu ciekawy: D – voddan

+0

pierwszy, trzeci też jest ładny – Yaroslav