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()
)
答案 0 :(得分:1)
如果您在return
内使用run { }
且内联此中缀功能,则在getSphereOrbitPos
被调用之前从pop()
返回,因此请勿执行此操作这一点。
块的签名是MatrixStack.() -> Any
,所以你的块必须返回一些东西。您未在block
内使用run
的结果,因此您可以将MatrixStack.() -> Any
更改为MatrixStack.() -> Unit
,因此不会期望{{1}的任何返回值}
另一个问题是,是否有特殊原因要始终从block
返回this
?
如果您需要返回中间值并仍然调用run
和push()
,则可以将您的功能更改为
pop()