logging - 如何在 'for' 理解中添加跟踪?

标签 logging scala

用于 for 中的日志跟踪理解,我使用了这样的虚拟赋值:

val ll = List(List(1,2),List(1))            

for {
  outer <- ll 
  a = Console.println(outer)   // Dummy assignment makes it compile
  inner <- outer
} yield inner
a =有点尴尬。有更干净的方法吗?

最佳答案

您可以随时定义自己的 trace功能:

def trace[T](x: T) = {
  println(x) // or your favourite logging framework :)
  x
}

那么 for comprehension 看起来像:
for { 
  outer <- ll
  inner <- trace(outer)
} yield inner

或者,如果您想打印更多信息,您可以定义 trace如下:
def trace[T](message: String, x: T) = {
  println(message)
  x
}

和理解看起来像:
for { 
  outer <- ll
  inner <- trace("Value: " + outer, outer)
} yield inner

编辑:回复你的评论,是的,你可以写trace使其作用于目标的右侧!你只需要使用一些隐含的技巧。实际上,它看起来确实比应用于左侧时要好得多:)。

为此,您必须首先定义一个类,即 Traceable然后定义到该类的隐式转换:
class Traceable[A](x: A) { 
  def traced = {
    println(x)
    x
  }
}

implicit def any2Traceable[A](x: A) = new Traceable(x)

然后你唯一需要在你提供的代码中修改的是添加 traced到要跟踪的值的末尾。例如:
for { 
  outer <- ll
  inner <- outer traced
} yield inner

(这是由 Scala 编译器翻译成 outer.traced )

关于logging - 如何在 'for' 理解中添加跟踪?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2322783/

相关文章:

scala - 如何配置 Akka Pub/Sub 在同一台机器上运行?

node.js - 配置 Azure AppInsights for Node.js 应用程序

c# - 如何实例化 C# TraceSources 以记录(多线程)ASP.NET 2.0 Web 应用程序(asmx ws)?

logging - Powershell 计划任务冲突?

scala - elastic4s 和 play framework 2.2.1

Scala Intellij 建议用非空替换大小检查,但为什么呢?

java - Git 如何如此快速地计算 SHA 哈希值?

scala - 模拟specs2中的slick.dbio.DBIO组成

amazon-web-services - 云信息 : ECS TaskDefinition CloudWatch logs retention policy

java - logging.properties 中的多种格式