如何在使用currying时将Implicit参数放入范围

时间:2012-02-27 16:40:52

标签: scala

有没有办法将隐式参数传递给curried函数。我正在使用脏修复(见下文),但它不漂亮。我希望能够将隐式var“i”作为隐式参数传递。

case class myLoaner() {
  implicit val i = "How to get this val into scope within the session function"

  def withCode[T](session: => T): Either[Exception, T] = {
    try {
      Right(session)
    } catch {
      case ex: Exception => {
        Left(ex)
      }
    }
  }
}

object Test {
  def main(args: Array[String]) {
    val r = myLoaner()

    r.withCode {
      implicit val imp = r.i // I want to get rid of this line of code and use the implict val defined above directly
      val h = new Helper
      h.run 
    }
  }

  class Helper {
    def run(implicit i: String) {
      println(i)
    }
  }
}

2 个答案:

答案 0 :(得分:2)

val r = myLoaner()之后,您可以写

import r.i

import r._

做你想做的事。或者,您可以标记r本身implicit并提供此额外定义:

implicit def loanerString(implicit loaner: myLoaner): String = loaner.i

...但是现在有一点点暗示开始漂浮在我身上,所以明智地使用它。有时太多隐含的魔法会损害代码的可读性和可理解性。

答案 1 :(得分:0)

您始终可以直接传递隐式参数,例如为h.run(r.i)