在 Kotlin 中,我可以访问已知的“when”子句值吗?

问题描述 投票:0回答:1

我有一些此类代码的实例:

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”子句已知的选项吗? (我怀疑不是,但 Kotlin 总是令人惊讶。)

我不想用需要与when子句保持最新的标志来装饰枚举,也不想将lambda添加到枚举中,以将此when子句转换为基于分派的逻辑。

谢谢。

kotlin reflection
1个回答
0
投票

我不认为有办法“正确”地做到这一点,但你也许可以做一个鬼鬼祟祟的邪恶黑客。你可能不应该真正实现这个;这只是一个疯狂的想法。

如果包含

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.")
    }

你必须找到一种方法来避免无休止的递归,但你明白了。

© www.soinside.com 2019 - 2024. All rights reserved.