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

时间:2014-08-12 17:12:09

标签: 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 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)

感谢, 迪安

1 个答案:

答案 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)

这应该也可以。