2013-09-01 14 views
10

Więc starałem się pracować z ukrytych parametrów i zmiennych po raz pierwszy i to działa perfekcyjnieniejawne parametry konstruktora

class Test(implicit val a: Int) { 

    bar(5) 

    def bar(c: Int)(implicit d: Int): Unit = { 
     println(d) 
    } 
} 

Potem próbowałem go w jakiś bardziej skomplikowanego kodu

class GameScreen(val game : Game)(implicit val batch: SpriteBatch, implicit val world: World, implicit val manager: AssetManager) extends Screen { 

    val camera : OrthographicCamera = new OrthographicCamera 

    createOpenGLStuff() 
    createMap() 

    def createMap(implicit w : World) : Unit = 
    { 
    } 

Ale teraz dostaję błąd

- not enough arguments for method createMap: (implicit w: 
com.badlogic.gdx.physics.box2d.World)Unit. Unspecified value parameter w. 
Nie można wiedzieć, dlaczego to nie działa, mogę napisać
createMap(this.world) 

I wszystko jest dobrze, ale ponieważ ten świat jest ukryty (tak myślę?) Nie powinienem tam jej tam podawać. Co ja tu robię/rozumiem źle?

+0

Mam nadzieję, że nie działają z ukrytych liczb w rzeczywistym projekcie. – ziggystar

+0

To było tylko po to, aby przetestować zachowanie zmiennych niejawnych. Poza tym, dlaczego niejawne liczby całkowite są złe? Nie mam pojęcia, gdzie ich użyć, ale nigdy nie wiadomo. – Nozdrum

+3

Zwykle przyjmuje się tylko niejawne argumenty o bardzo konkretnych typach. Liczby całkowite mogą być używane do wielu rzeczy, ale możesz mieć tylko jedną ukrytą wartość każdego typu. Jeśli masz funkcję przyjmującą domyślne int jako timeout, a inną przyjmującą domyślną int jako losową wartość początkową, może się zdarzyć, że druga funkcja uzyska niejawną wartość, która miała być limitem czasu. – ziggystar

Odpowiedz

11

Trzeba upuścić parens

class GameScreen(val game : Game)(implicit val batch: SpriteBatch, implicit val world: World, implicit val manager: AssetManager) extends Screen { 

    val camera : OrthographicCamera = new OrthographicCamera 

    createOpenGLStuff() 
    createMap //this works 

    def createMap(implicit w : World) : Unit = 
    { 
    } 

Jednak metoda createMap musi wykonać pewne skutki uboczne, więc nazywając ją bez parens naprawdę nie jest dobrą rzeczą.

Proponuję zmianę do:

def createMap()(implicit w : World) : Unit = { 
    ... 
} 

ten sposób można dostać się do zachowania oryginalnego telefonicznej składnię: createMap()

+0

Ach, to jest takie oczywiste, jeśli je widzisz. Nawiasy są zawsze trudne w scali - przynajmniej dla mnie. – Nozdrum

Powiązane problemy