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 }