【问题标题】:Scala implicit conversion + parameter together with Play2 controller/viewScala 隐式转换 + 参数连同 Play2 控制器/视图
【发布时间】:2012-08-05 22:06:11
【问题描述】:

我有以下 play2 代码:

  implicit def contextToRequest(rc: RequestContext[_]) = rc.request
  implicit def contextToFlash(rc: RequestContext[_]) = rc.request.flash
  implicit def contextToSession(rc: RequestContext[_]) = rc.request.session

  def login: Action[AnyContent] = PublicAction { implicit rc =>
    Ok(html.login(loginForm))
  }

RequestContext 是我自己的 Play2 Request 的自定义类包装器。

我的 scala 视图开始于:

@(form: Form[(String,String,Boolean)])(implicit flash: Flash, session: Session,rc: utils.RequestContext[_])

但是编译器说:

找不到参数flash的隐含值:play.api.mvc.Flash

有人可以向我解释为什么它不起作用吗? 也许我们不能对隐式参数使用隐式转换?

那么有人可以向我解释为什么已经存在从 Play2 请求到 Session/Flash 的隐式转换,而当我这样做时它不起作用?

【问题讨论】:

    标签: scala playframework implicit-conversion implicit


    【解决方案1】:

    嗯,它似乎适用于:

    implicit def contextToRequest(implicit rc: RequestContext[_]) = rc.request
    

    我不需要其他 2 种方法,因为 Play2 已经提供了 Request 到 Flash/Session 的隐式转换

    【讨论】:

      【解决方案2】:

      当您最终拥有多个隐式参数时,其中一些是其他参数的成员属性,那么您的设计就有问题。

      class B
      class C
      
      class A {
        val b:B = _
        val c:C = _ 
      
      }
      
      def myMethod(someData:String)(implicit a:A, b:B, c:C) {
      
      }
      

      实际上,您希望在方法中包含该 A 的 B 和 C 成员。但是,通过这样的签名,可以提供给定的 A 和 B 和 C 与此无关A. 正确的签名如下

        def myMethod(someData:String)(implicit a:A) {
          // trick to import members variable
          import a._
          println(b)
          println(c)
        }
      

      【讨论】:

      • 完全正确,这3个参数不是必需的,因为我的包装器包含所有必需的数据
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 2011-01-17
      相关资源
      最近更新 更多