2017-03-28 13 views
0

は、私がblock()Kotlin、高次機能のトラブル

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 
    } 

私は次のエラーを取得する:

Expected a value of type Any

は私がMatrixStack.run{ }を使って、欲しいものを得ることができます方法はありますか?あなたはrun { }returnを使用して、この中置関数がインライン展開されている場合は

+0

にあなたの機能を変更することができますに私はあなたのラムダの最後の行の後に 'Unit'を追加することによって、それを修正することができると思います。 'result = ... 'の代入が' Any'型ではないので不平を言います。 – marstran

答えて

1

(代替を手動push()block()pop()を呼び出すことですので)、その後、あなたはpop()が呼び出される前にgetSphereOrbitPosから返すので、それをしません。

ブロックの署名がMatrixStack.() -> Anyであるため、ブロックは何かを返す必要があります。あなたはrun内部blockの結果を使用していないので、あなたはMatrixStack.() -> UnitからMatrixStack.() -> Anyを変更することができ、したがって、常にrunからthisを返すために、特定の理由があるblockもう一つの問題がある

から任意の戻り値を期待していませんか? あなたは中間の値を返すと、まだpush()pop()を呼び出す必要がある場合、あなたは

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

    return result 
} 
+0

はい、私は(この方法では)別の 'block()'を連結することができるので、 'run'から' this'を返すと思います(https://github.com/java-opengl-labs/modern- jogl-examples/blob/master/src/main/kotlin/main/tut07/worldScene.kt#L191)を使用します。とにかく、私は ' - >ユニット' – elect

+0

を試してみるよね、それは欠陥、おかげで動作します! – elect

+1

それから、私は、標準ライブラリと矛盾しないように、代わりに 'apply'という名前を使用すると主張します。 stdlibで 'run'を実行すると、ブロックが受信側で実行され、ブロックの結果が返されます。 'apply'は代わりに受信者のブロックを実行し、受信者を返します – D3xter

関連する問題