我想知道这是否可以使用 Scala 的类型系统来完成。
基本上,我想创建一个接受 aresult
类型Try[T]
并打印出一条消息的日志记录方法,该消息取决于result
是 aSuccess
还是 aFailure
例如,签名可能看起来像
def logTry[T](what: Try[T], block: T => String): Unit
并且可以这样使用:
val size: Try[(Int, Int)] = Try(getSizeAndTimestampFromDatabase())
logTry(size, e => "size is " + e._2 + " kb")
这将输出
size is 13 kb
如果size
是Success(x: Int)
,例如,Success(13)
或者
error: size is (not available)
如果size
如果类型Failure(t: Throwable)
棘手的部分是,如果它是 a ,我们需要能够访问Try
用于打印到屏幕的对象,或者如果它是 a作为占位符Success
,则打印选择的默认字符串(例如“(不可用)”) 。Failure
此外,它必须使用非常通用的类型,T
或者Any
范围可以从简单的标量值到类的实例等。
这个古怪函数的用例是,它可以非常方便地以一种信息丰富的方式记录 Try 对象,而不会用 map/recover 或 match 语句使代码混乱。
这是我想出的骨架,当然最难的部分还没有弄清楚。
def logTry[T](what: Try[T], block: T => String): Unit = {
what match {
case Success(res) => println(block(res))
case Failure(t) => println(???) // how to do this
}
}