用于 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/