Javaでプログラミングするとき、私は常に入力パラメーターとメソッドの戻り値を記録しますが、スカラーではメソッドの最後の行が戻り値になります。ので、私のような何かやっていますスカラーにログインするときの戻り値の保持方法
val rs = calcSomeResult()
withValue(logger.info)("result is:" + rs, rs)
それがログに記録します。そして、私はとしてそれを使用
class LogUtil(val f: (String) => Unit) {
def logWithValue[T](msg: String, value: T): T = { f(msg); value }
}
object LogUtil {
def withValue[T](f: String => Unit): ((String, T) => T) = new LogUtil(f).logWithValue _
}
:それは簡単にするために
def myFunc() = {
val rs = calcSomeResult()
logger.info("result is:" + rs)
rs
}
を、私はユーティリティを書きます値を返し、それを返します。それは私のために働くが、厄介なようだ。私は古いJavaプログラマだが、scalaには新しいので、scalaでこれを行うもっと慣用的な方法があるかどうかわからない。あなたの助けのための
おかげで、今私はそれをSLF4Jからロガー、およびテストケースを渡すことができるように、私はFパラメータを追加ケストレルを使用してutilのより良いコンビネータromusz
object LogUtil {
def kestrel[A](x: A)(f: A => Unit): A = { f(x); x }
def logV[A](f: String => Unit)(s: String, x: A) = kestrel(x) { y => f(s + ": " + y)}
}
でmetionedを作成あなたは、基本的な考え方の権利を持っている
class LogUtilSpec extends FlatSpec with ShouldMatchers {
val logger = LoggerFactory.getLogger(this.getClass())
import LogUtil._
"LogUtil" should "print log info and keep the value, and the calc for value should only be called once" in {
def calcValue = { println("calcValue"); 100 } // to confirm it's called only once
val v = logV(logger.info)("result is", calcValue)
v should be === 100
}
}
におけるいくつかの改善と、これが利用可能になってきましたか?はい、スカラではありません。そうです。 –