我有以下代码
class LazyLogRecord(
level: javalog.Level,
messageGenerator: => AnyRef
) extends LogRecord(level, "") {
// for each logged line, generate this string only once, regardless of how many handlers there are:
override lazy val getMessage : String = messageGenerator().toString
}
此代码无法编译,因为我尝试调用messageGenerator。我可以修改
中的代码messageGenerator: => AnyRef
to
messageGenerator: () => AnyRef
但是我的上游代码log.debug(" hi there" + variable +" asfdsaf")除非我将该代码更改为log.debug(()=&gt ; {"嗨那里" +变量+" asdfas"})
如果我坚持使用messageGenerator.toString,则getMessage将返回" function0"而不是调用函数结果,并在该结果上调用toString。
我如何解决这个问题以实现两全其美?
编辑: 非常奇怪,我刚刚将代码修改为此
override lazy val getMessage : String = {
val funkyThing : () => AnyRef = messageGenerator
funkyThing().toString
}
它说mesasgeGenerator是" AnyRef"当它应该说类型" => AnyRef&#34 ;.然后它抱怨它无法传播" AnyRef"到"()=> AnyRef"
那里发生了什么?这也不对。
编辑2: 我开始认为这是一个客户问题。我的客户端代码可能有误。我的客户端代码是这样的,我传入一个传递给LazyLogRecord的函数....我的函数定义错了吗?我认为就像那时我把它传递给=> AnyRef和它的类型并不完全相同,但是我需要测试延迟评估,但它失败了。
val logger = Logger.get("lazyTest2")
logger.setLevel(Level.DEBUG)
var executed = false
val function = () => {
executed = true
"asdf"+executed+" hi there"
}
logger.debugLazy(function)
assert(!executed)
感谢, 迪安
答案 0 :(得分:2)
根据您的最新更新,将您的通话更改为:
val logger = Logger.get("lazyTest2")
logger.setLevel(Level.DEBUG)
var executed = false
logger.debugLazy({
executed = true
"asdf"+executed+" hi there"
})
应该解决您的问题。您之前的代码被解释为:
logger.debugLazy({function})
这是一个返回你的function0的函数,因为它的结果不是你想要的。您也可以尝试将function
定义为def而不是像这样定义val:
def function() = {
executed = true
"asdf"+executed+" hi there"
}
logger.debugLazy(function)
这应该也可以。