Котлин, проблема высокого порядка функций

У меня есть следующая функция HO на 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() )

Если вы используете return внутри run { } и эта функция infix встроена, вы возвращаетесь из getSphereOrbitPos до getSphereOrbitPos pop() , поэтому не делайте этого.

И подпись блока – MatrixStack.() -> Any , поэтому ваш блок должен что-то вернуть. Вы не используете результат выполнения внутри block , поэтому вы можете изменить MatrixStack.() -> Any на MatrixStack.() -> Unit и, следовательно, не ожидайте, что какое-либо возвращаемое значение из block

Другой вопрос заключается в том, есть ли конкретная причина, чтобы вернуть this из run всегда? Если вам нужно вернуть промежуточное значение и по-прежнему вызывать push() и pop() , вы можете изменить свою функцию на

 infix inline fun <T> run(block: MatrixStack.() -> T): T { pop() val result = block() push() return result } 
Intereting Posts
В тесте Spock модульный метод не называется Kotlin + Dagger2: не может быть предоставлен без конструктора @Inject или из метода @ Provides- или @ Produces-annotated Конвертер Kotlin больше не работает для Android Studio 3.0 Kotlin и идиоматический способ писать, «если не null, else …», основанный на изменяемой ценности Объявление байта в Kotlin делает ошибку времени компиляции «Целочисленный литерал не соответствует ожидаемому типу Byte» как присоединиться к двум таблицам в android, используя метод запросов поставщика контента? Как группировать предметы Arraylist времени в HashMap в Котлине? Альтернативы полем бокса или расширению ВСЕХ строк в Котлине? "Coroutine local" переменные в kotlin Текстовый объект объекта Kotlin, реализующий дикий кардочесальный, саморегуляторный общий интерфейс Java изменяет содержимое класса kotlin на null Ошибка Adobe flashplayer или HTML5 Browser с поддержкой WebGL или CSS3D, необходимой для виртуального тура в Android Закрыть / скрыть Softkey от Android с Kotlin Изменить значение nullability параметра переопределенной функции в kotlin (число + «Больше 5») Не работает «Ошибка конкатенации»