Scala 如何允许传入a=>;AnyRef函数并调用该函数

Scala 如何允许传入a=>;AnyRef函数并调用该函数,scala,scala-2.9,Scala,Scala 2.9,我有以下代码 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 get

我有以下代码

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”+变量+“asfdsaf”)不会编译,除非我将该代码更改为log.debug(()=>{“hi-there”+变量+“asdfas”})

如果我坚持使用messageGenerator.toString,getMessage将返回“function0”,而不是调用函数results,并对该结果调用toString

我该如何解决这一问题,使两者兼而有之

编辑: 非常奇怪,我只是修改了代码

override lazy val getMessage : String = {
   val funkyThing : () => AnyRef = messageGenerator
   funkyThing().toString
}
当mesasgeGenerator应该说type“=>AnyRef”时,它说它是类型“AnyRef”。然后它抱怨无法将“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)
谢谢,
Dean

根据您的最新更新,将您的通话更改为:

val logger = Logger.get("lazyTest2")
logger.setLevel(Level.DEBUG)
var executed = false


logger.debugLazy({
  executed = true
  "asdf"+executed+" hi there"
})
应该解决你的问题。您以前的代码被解释为:

logger.debugLazy({function})
这是一个返回函数0作为结果的函数,它不是您想要的结果。您也可以尝试将
函数定义为def,而不是val,如下所示:

def function() = {
  executed = true
  "asdf"+executed+" hi there"
} 
logger.debugLazy(function)

这应该也行。

我删除了我的答案,因为它是不正确的,我希望其他人能分享一些关于这方面的信息。谢谢你花时间尝试;)。我想这与您在函数定义(而不是其结果)上调用
toString
有关,但这只是猜测。您描述的行为非常奇怪,听起来可能是个bug。我无法复制它。你能提供一个展示这种行为的自包含的可运行示例吗?@EndeNeu是的,这就是我尝试使用messageGenerator()的原因。toString不起作用:(这篇文章有点相关,我想知道为什么一篇文章编译了,而另一篇没有。。。