高阶函数作为枚举参数

5

我希望将一个高阶函数作为枚举参数使用,但是这并不起作用。我有以下声明:

enum class Enum(val someValue: Int, val someMethod: () -> Unit)
{
    FIRST_VALUE(0, {method0()}),
    SECOND_VALUE(1, {method1()})

    fun method0() {

    }

    fun method1() {

    }
}

但是找不到method0()method1()。错误为未解决的引用:method0

是否可以通过枚举实现这个功能?

2个回答

5
< p > Enum 中的方法类型是 Enum.() -> Unit,而不是 () -> Unit。如果您更改参数类型,它将起作用。

请注意,您还可以使用 Enum::method0 的方法引用,而不是创建新的 lambda 表达式。这样更易读一些。

enum class Enum(val someValue: Int, val someMethod: Enum.() -> Unit) {
    FIRST_VALUE(0, Enum::method0), // Using a method reference
    SECOND_VALUE(1, {method1()})

    fun method0() {

    }

    fun method1() {

    }
}

@Sergey 刚刚不得不添加 Enum::method0。感谢你的提醒。 - marstran

2

是的,这是可能的,但您需要将函数method0method1移出Enum类:

enum class Enum(val someValue: Int, val someMethod: () -> Unit)
{
    FIRST_VALUE(0, ::method0), // pass reference to the function
    SECOND_VALUE(1, { method1() }); // pass lambda and call `method1()` function in it
}

fun method0() {

}

fun method1() {

}

你可以像 FIRST_VALUE 示例中演示的那样,将引用传递给函数作为lambda参数,或者在lambda中调用一个函数 - 如 SECOND_VALUE 示例所示。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接