13

所以我第一次尝试使用隐式参数和变量,这工作得很好

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 是隐式的(我认为?)我不需要在那里指定它。我在这里做什么/理解错误?

4

2 回答 2

13

您需要删除括号

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 方法必须执行一些副作用,因此在没有括号的情况下调用它并不是一件好事。

我建议改为:

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

这样,您就可以保持原来的调用语法:createMap()

于 2013-09-01T20:59:29.700 回答
3

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

class GameScreen(val game : Game)(implicit val batch: SpriteBatch, val world: World, val manager: AssetManager) extends Screen {...}
于 2019-06-26T18:09:52.150 回答