隐式构造函数参数

时间:2013-09-01 20:43:43

标签: scala

所以我第一次尝试使用隐式参数和变量,这是完全正常的

class Test(implicit val a: Int) {

    bar(5)

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

然后我在一些更复杂的代码中尝试了它

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 = 
    {
    }

但现在我收到了错误

- not enough arguments for method createMap: (implicit w: 
 com.badlogic.gdx.physics.box2d.World)Unit. Unspecified value parameter w.

我不知道为什么这不起作用,我可以写

createMap(this.world)

一切都很好,但是因为this.world是隐含的(我认为?)我不应该在那里指定它。我在做什么/理解错误在这里?

2 个答案:

答案 0 :(得分:11)

你需要丢弃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 = 
  {
  }

然而,createMap方法必须执行一些副作用,所以不用parens调用它并不是一件好事。

我建议改为:

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

这样,您可以维护原始调用语法:createMap()

答案 1 :(得分:1)

此外,您只需要在参数列表的开头使用隐式关键字:

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