我想写一个通用的辅助方法:
def using(closeable: [B has close() method], callback: [B has close() method] => A): A {
try {
callback(closeable)
} finally {
closeable.close()
}
}
意图是我可以使用具有close()方法的任何东西:
using(new FileInputStream(...)) {
stream => stream.read()
}
using(dataSource.getConnection) {
conn => using(conn.createStatement()) {
statement => using(statement.executeQuery("...")) {
rs => rs.getString(1)
}
}
}
我正在寻找的是如何命名,以便我可以自己搜索语法,以及语法本身。
答案 0 :(得分:8)
完整地提供
type Closeable = {def close() }
def using[A,B](a: A with Closeable)(f: A => B) =
try { f(a) } finally { a.close() }
(您也可以写A {def close()}
而不是A with Closeable
)
测试:
case class X(i: Int) { def close() = println("closed") }
using(X(3)){x => println("i is " + x.i) }
输出:
我是3
关闭
答案 1 :(得分:5)
这称为结构类型。
答案 2 :(得分:4)
Debilski是对的,其语法为closable: { def close() }
编辑:这是您想要根据对象使用的替代Scala implementation of the .NET like using construct的链接,它是应用方法。