0

我已经定义了如下特征,

trait Log {
  val logEnabled: Boolean
  def log(msg: String) {
    if(logEnabled) {
       println(msg)
    }
  }
}

并想使用如下:

def log(enabled: Boolean)(msg: String) = new Log(){
  val logEnabled = enabled
}
implicit val enabled = true;
val log1 = log(true) _
log1("hi, world")

但结果是空白的,没有打印出来,不是我想的那样。

有人可以解释一下这背后的机制吗?

4

1 回答 1

1

您上面的代码log1("hi, world"),实际上并没有调用该Log.log函数,而是产生一个Log. 这是因为调用了咖喱函数:

def log(enabled: Boolean)(msg: String) = new Log(){ ... }
val log1 = log(true) _

产生一个函数,给定一个字符串,将返回一个日志。

你可能想要的是:

trait Log {
  val logEnabled: Boolean
  def apply(msg: String) {
    if(logEnabled) {
      println(msg)
    }
  }
}

def log(implicit enabled: Boolean) = new Log(){
     val logEnabled = enabled
   }
implicit val enabled = true
val log1 = log
log1("hi, world")

请注意如何在 Log 上调用 apply 方法。

于 2013-03-29T03:31:10.003 回答