Kotlin,高阶功能麻烦

时间:2017-03-28 09:59:04

标签: kotlin

MatrixStack

上有following HO function
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 个答案:

答案 0 :(得分:1)

如果您在return内使用run { }且内联此中缀功能,则在getSphereOrbitPos被调用之前从pop()返回,因此请勿执行此操作这一点。

块的签名是MatrixStack.() -> Any,所以你的块必须返回一些东西。您未在block内使用run的结果,因此您可以将MatrixStack.() -> Any更改为MatrixStack.() -> Unit,因此不会期望{{1}的任何返回值}

另一个问题是,是否有特殊原因要始终从block返回this? 如果您需要返回中间值并仍然调用runpush(),则可以将您的功能更改为

pop()