scala - 是否可以在 Scala 中将 "this"作为隐式参数传递?

标签 scala implicit

假设我想用记录异常并继续的 try-catch 块包装可以抛出异常的代码。就像是:

loggingExceptions {
  // something dangerous
}

理想情况下,我想用于记录调用对象上定义的 Logger(如果有)(如果没有,则会出现编译时错误)。我很想定义这样的东西:
def loggingExceptions[L <: { def logger: Logger }](work: => Unit)(implicit objectWithLogger: L): Unit = {
  try {
    work
  } catch {
    case t: Exception => objectWithLogger.logger.error(t.getMessage)
  }
}

在客户端代码中 objectWithLogger 会以某种方式“神奇地”扩展为“this”。这(或类似的事情)可能吗?

最佳答案

事实上,它可以随心所欲地完成。其他答主很快就投降了。没有白旗!

package object foo {
  type HasLogger = { def logger: Logger }
  implicit def mkLog(x: HasLogger) = new {
    def loggingExceptions(body: => Unit): Unit =
      try body
      catch { case ex: Exception => println(ex) }
  }
}

package foo {
  case class Logger(name: String) { }

  // Doesn't compile:
  // class A {
  //   def f = this.loggingExceptions(println("hi"))
  // }
  // 1124.scala:14: error: value loggingExceptions is not a member of foo.A
  //         def f = this.loggingExceptions(println("hi"))
  //                      ^
  // one error found  

  // Does compile
  class B {
    def logger = Logger("B")
    def f = this.loggingExceptions(println("hi"))
    def g = this.loggingExceptions(throw new Exception)
  }
}

object Test {
  def main(args: Array[String]): Unit = {
    val b = new foo.B
    b.f
    b.g
  }
}

// output
//
// % scala Test
// hi
// java.lang.Exception

关于scala - 是否可以在 Scala 中将 "this"作为隐式参数传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4269572/

相关文章:

scala - Scala 中丢失类型信息和类型类实现

wolfram-mathematica - 隐式函数的 FindFit - mathematica

scala - 如何询问 Scala 是否存在所有类型参数实例化的证据?

json - Play Json : Transforming a Reads[T] to Reads[Seq[T]] without implicits

scala - 将未知长度的元组转换为 Scala 中的列表

scala - bigquery 在数组外添加重复记录

scala - private[foo] 适用于任何基于 foo 的包?

scala - 类型边界意外更改 Scala 隐式参数解析的优先级

Scala 隐式转换在某些条件下应用,但在其他条件下不应用

Scala 的排序和无