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") } }
看起来有点凌乱,因为我习惯了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 } }
在Kotlin中有类似的方法吗?
那么,对于斯卡拉的缘故,你可以写:
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() } }
一个更直接的版本将是:
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() } }
但我绝对喜欢:
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 }