我想使用高阶函数作为枚举参数。但这是行不通的。我有以下声明:
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
。
是否可以通过枚举实现这一点?
答案 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))
和method0
从method1
类中移出:
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
示例所示。