如何确保隐式变量从trait传递给方法?

时间:2013-02-13 16:05:24

标签: scala playframework playframework-2.0

我的特点如下:

trait NewTrait { 
  def NewTrait(f: Request[AnyContent] => Result):  Action[AnyContent] = {
    Action { request =>
      implicit val newTrait = new model.helper.newTrait
      f(request) 
    }
  }
}

使用该特征的控制器,并尝试将隐式val newTrait传递给视图:

object Test extends Controller with NewTrait {

  def foo(num: Int) = NewTrait { request =>
    val view = (views.html.example.partials.viewWrap)       
    Ok(views.html.example.examplePage(views.html.shelfPages.partials.sidebar())
}

在foo中,newTrait不在范围内,但是将其纳入范围的最佳做法是什么?它必须是每个收到的请求都是唯一的。如果我从foo中重新声明隐式val,它会工作,但我每次都必须在控制器中重复该声明,如果我可以将其隐藏在特征中,代码看起来会更清晰。是否有任何方法可以将特征中的隐含值传递给控制器​​?

3 个答案:

答案 0 :(得分:0)

将上述val设为字段变量:

trait NewTrait { 
  implicit val newTrait = new model.helper.newTrait
  ...
}

现在它将在方法foo范围内。

答案 1 :(得分:0)

虽然我发现这些名字有点令人困惑(可能是示例代码),但这是你可以做到的:

trait NewTrait {
  def NewTrait(f: Request[AnyContent] => model.helper.newTrait => Result): Action[AnyContent] = {
    Action { request =>
      val newTrait = new model.helper.newTrait
      f(request)(newTrait)
    }
  }
}

在使用它的代码中:

object Test extends Controller with NewTrait {
  def foo(num: Int) = NewTrait { request => implicit newTrait =>
    Ok
  }
}

答案 2 :(得分:0)

你可以:

trait NewTrait {
    def gotRequest(req:Request) = {
        implicit val newTrait = new model.helper.newTrait
        // don't have to pass the newTrait parameter here 
        // explicitly, it is used implicitly
        Whatever.f(request)
    }
}

object Whatever {
    def f(req:Request)(implicit val newTrait:NewTrait) = {
        //newTrait is in scope here.

        //...the rest of your code
    }
}