如何使用用户输入选择枚举类中的元素- Kotlin

0md85ypi  于 2022-11-30  发布在  Kotlin
关注(0)|答案(1)|浏览(201)

我需要得到 从枚举类中使用与元素同名的用户输入来创建元素。除非我级联if语句,否则它不起作用。
我试图通过创建一个变量并使用它来获取Dir来获取元素,但它不起作用

enum class Dir( val dx: Int = 0, val dy: Int = 0) {
    UP(0, -1), Down(0, 1), Left(-1,0), Right(1,0)
}

fun main(){
    val choice = readln()
    println(Dir.choice)
}

我期望得到如下结果:
使用者输入:向上
(0,-1)(% s)
使用者输入:向下
(0个,1个)

93ze6v8z

93ze6v8z1#

有几种方法可以做到这一点,其中之一是使用枚举的内置valueOf()函数,该函数返回Dir值,其名称与传递给valueOf的字符串相匹配:

Dir.valueOf("Down") == Dir.Down

但是这有点脆弱,这取决于您从哪里获得输入。如果在重构过程中您决定重命名一个常量,您可能会中断一些用户输入。
一个很好的例子是您在值UP(全部大写)中输入的错误。如果您将其重命名为Up,则输入UP的用户将开始失败。
因此,您可以改为在枚举中添加一个属性来表示所需的外部名称,并编写一个函数来根据此外部名称查找枚举值:

enum class Dir(
    val cliName: String,
    val dx: Int = 0,
    val dy: Int = 0,
) {
    UP("up", 0, -1),
    Down("down", 0, 1),
    Left("left", -1, 0),
    Right("right", 1, 0);

    companion object {
        private valuesByCliName = values().associateBy { it.cliName }

        fun fromCliName(name: String): Dir = valuesByCliName[name]
            ?: throw IllegalArgumentException("Unknown direction '$name'")
    }
}

相关问题