首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >登录scala时如何保持返回值?

登录scala时如何保持返回值?

提问于 2018-01-25 01:17:51
回答 2关注 0查看 246

在用java编程时:

代码语言:javascript
复制
def myFunc() = {
  val rs = calcSomeResult()
  logger.info("result is:" + rs)
  rs
}

为了简化操作,编写了一个实用程序:

代码语言:javascript
复制
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 _
}

然后:

代码语言:javascript
复制
val rs = calcSomeResult()
withValue(logger.info)("result is:" + rs, rs) 

可以尝试用romusz的kestrel组合器创建了一个util

代码语言:javascript
复制
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)}
}

测试用例是:

代码语言:javascript
复制
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
  }
}

回答

和开发者交流更多问题细节吧,去 写回答
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档