Kotlin,高级功能麻烦
我在MatrixStack
上有以下HO函数
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 }
我得到以下错误:
期望值类型任何
有没有一种方法可以通过使用MatrixStack.run{ }
来获得我想要的? (因为另一种方法是手动调用push()
, block()
和pop()
)
如果你在run { }
里面使用return
并且这个infix函数是内联的,那么你在getSphereOrbitPos
pop()
之前从getSphereOrbitPos
返回,所以不要这样做。
而块的签名是MatrixStack.() -> Any
,所以你的块必须返回一些东西。 你没有使用block
内run
的结果,所以你可以改变MatrixStack.() -> Any
到MatrixStack.() -> Unit
,因此不要期望block
返回值
另一个问题是,是否有一个特别的原因总是返回run
? 如果您需要返回一个中间值并仍然调用push()
和pop()
,则可以将其更改为
infix inline fun <T> run(block: MatrixStack.() -> T): T { pop() val result = block() push() return result }
- 没有类的Android应用程序?
- Corda:error = org.hibernate.InstantiationException:没有实体的默认构造函数
- 如何从java类中的kotlin类创建对象?
- Kotlin单元测试从Android Studio UI运行时始终通过
- kotlin注释处理器中的可空类型
- Firebase-Firestore不能同时加载2个文档的信息
- 在Kotlin的抽象超类中的内部类?
- 类未find,androidTest中使用Android Studio 3.0.1,Room,Kotlin的空测试套件
- IncompleteAnnotationException:dagger.提供缺少的元素类型