2015-09-23 15 views
11

Tôi có đoạn mã saumẫu phù hợp trên bản ghi trong 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") 
    } 
} 

trông kinda lộn xộn đối với tôi như tôi đã quen với điều này trong 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 
    } 
} 

Có cách nào để đạt được một cái gì đó tương tự như trong Kotlin?

+0

Logic dường như không phụ thuộc vào loại 'item'. Nếu có, bạn có lẽ nên đề cập đến nó hoặc sửa đổi mẫu mã. –

Trả lời

12

Vâng, vì lợi ích của Scala, bạn có thể viết:

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

Một phiên bản thẳng về phía trước nhiều hơn sẽ là:

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

Nhưng tôi chắc chắn thích:

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, bạn đã sử dụng tùy chọn nào (trong số ba trường hợp trên)? Chỉ cần tò mò: D – voddan

+0

cái đầu tiên, cái thứ ba cũng đẹp – Yaroslav

Các vấn đề liên quan