我有一些此类代码的实例:
enum class Cat { Fat, Greedy, Sleepy, Lasagna }
...
when (cat) {
Fat -> // do fat
Greedy -> // do greedy
else -> throw RuntimeException("You have a $cat cat - I don't know about those.")
}
我希望它说“你有一只 $cat 猫 - 我只知道肥胖和贪婪”,但我不想在添加新子句时必须更新消息。
我不想用需要与when子句保持最新的标志来装饰枚举,也不想将lambda添加到枚举中,以将此when子句转换为基于分派的逻辑。
谢谢。
我不认为有办法“正确”地做到这一点,但你也许可以做一个鬼鬼祟祟的邪恶黑客。你可能不应该真正实现这个;这只是一个疯狂的想法。
如果包含
when
子句的函数是无副作用的:
when (cat) {
...
else -> {
knownCats = Cat.entries.map { cat ->
try {
currentFunction(cat)
true
} catch (e: RuntimeException) {
false
}
}
throw RuntimeException("You have a $cat cat - I only know about $knownCats.")
}
你必须找到一种方法来避免无休止的递归,但你明白了。