高阶函数作为枚举参数

时间:2019-01-15 08:29:47

标签: kotlin

我想使用高阶函数作为枚举参数。但这是行不通的。我有以下声明:

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

    fun method0() {

    }

    fun method1() {

    }
}

但是找不到method0()method1()。错误为Unresolved reference: method0

是否可以通过枚举实现这一点?

2 个答案:

答案 0 :(得分:4)

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() {

    }
}

答案 1 :(得分:2)

是可以的,但是您需要将函数qfeatures = torch.zeros(len(queries), 512, dtype=torch.float) endbatch = len(queries) // batch_size if len(queries) % batch_size != 0: endbatch += 1 for batidx in range(endbatch): st = batidx * batch_size en = min((batidx + 1) * batch_size, len(queries)) xbatch = query_img[st: en, :, :, :] qfeatures[st: en, :] = feature_model(xbatch.to(device)) method0method1类中移出:

Enum

您可以将对函数的引用作为lambda参数传递,如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() { } 示例所示,也可以lambda并在其中调用函数-如FIRST_VALUE示例所示。