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.logLog

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 に答える