首页 文章

Kotlin,高阶函数的麻烦

提问于
浏览
0

following HO function MatrixStack

inline infix fun run(block: MatrixStack.() -> Any): MatrixStack {
    push()
    block()
    pop()
    return this
}

在其他地方,我有一个方法,我试图返回 block() 中计算的中间结果

fun getSphereOrbitPos(modelMatrix: MatrixStack, orbitCenter: Vec3, orbitAxis: Vec3, orbitRadius: Float, orbitAlpha: Float): Vec3 {

    modelMatrix run {

        translate(orbitCenter)
        rotate(orbitAxis, 360.0f * orbitAlpha)

        var offsetDir = orbitAxis cross Vec3(0.0f, 1.0f, 0.0f)
        if (offsetDir.length() < 0.001f)
            offsetDir = orbitAxis cross Vec3(1.0f, 0.0f, 0.0f)

        offsetDir.normalize_()

        translate(offsetDir * orbitRadius)

        // this is what I'd like to return, top() = MatrixStack.top()
        return (top() * Vec4(0.0f, 0.0f, 0.0f, 1.0f)).toVec3()
    }
} // return error

如果我声明一个外部变量

fun getSphereOrbitPos(..): Vec3 {

    var result =  Vec3()

    modelMatrix run {
        ..
        result = (top() * Vec4(0.0f, 0.0f, 0.0f, 1.0f)).toVec3() // error
    }

我收到以下错误:

期望Any类型的值

有没有办法通过 MatrixStack.run{ } 获得我想要的东西? (因为替代方法是手动调用 push()block()pop()

1 回答

  • 1

    如果在 run { } 中使用 return 并且内联此中缀函数,则在调用 pop() 之前从 getSphereOrbitPos 返回,因此不要这样做 .

    块的签名是 MatrixStack.() -> Any ,所以你的块必须返回一些东西 . 您没有在 run 中使用 block 的结果,因此您可以将 MatrixStack.() -> Any 更改为 MatrixStack.() -> Unit ,因此不希望 block 返回任何值

    另一个问题是,是否有特殊原因要始终从 run 返回 this ?如果需要返回一个中间值并仍然调用 push()pop() ,则可以将函数更改为

    infix inline fun <T> run(block: MatrixStack.() -> T): T {
        pop()
        val result = block()
        push()
    
        return result
    }
    

相关问题