Peter Lerche
Peter Lerche

Reputation: 469

How to get Implicit parameter into scope when using currying

Is there a way to pass an implicit parameter into a curried function. I am using a dirty fix (se below) but it is not pretty. I would love to be able to pass the implicit var "i" as a implicit param.

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)
    }
  }
}

Upvotes: 1

Views: 239

Answers (2)

wingedsubmariner
wingedsubmariner

Reputation: 13667

You can always pass implicit parameters directly, e.g. as h.run(r.i).

Upvotes: 0

Jean-Philippe Pellet
Jean-Philippe Pellet

Reputation: 59994

After val r = myLoaner(), you can write

import r.i

or

import r._

to do what you want. Alternatively, you can mark r itself implicit and provide this extra definition:

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

... but now a little bit too many implicits start floating around for my taste, so use that wisely. Sometimes too much implicit magic harms the readability and understandability of your code.

Upvotes: 2

Related Questions