我正在学习scala并且喜欢提出自定义控制结构的能力,并且由于没有using
结构来关闭资源,我认为写一个是很方便的。然后我从David Pollak的书“Beginning Scala”中找到了这段代码。
using (Source.fromFile("file")) { source =>
println(source.mkString)
}
def using[A <: { def close() }, B](closable: A)(body: A => B): B =
try
body(closable)
finally
closable.close()
但我想知道是否有可能有类似的东西:
using (val source = Source.fromFile("file")) println(source.mkString)
答案 0 :(得分:2)
正如vitalli所暗示的那样,简短的答案是否定的(遗憾的是)。希望如果我解释你在Pollak的书中找到的方法定义和调用,那么它将变得清晰。
def using[A <: { def close() }, B](closable: A)(body: A => B): B
此using方法定义有两个参数列表(请参阅currying)。两个列表都有一个参数。第一个参数是可关闭的对象(类型A
)。第二个是从A
到B
的函数。
使用此行调用方法时:
using (Source.fromFile("file")) { source => println(source.mkString) }
第一个参数是Source.fromFile("file")
的返回值,它是一个可关闭的BufferedSource
。第二个参数是anonymous function:它接受一个参数source
,在其正文println(source.mkString)
中有一个语句并返回Unit
。
Scala编译器会自动从方法定义和您提供的第一个参数(BufferedSource
)中检测source
的类型。您可以重构该匿名函数并明确声明该类型:
using(Source.fromFile("file"))(eg)
def eg(source: BufferedSource): Unit = println(source.mkString)
但是,当然,匿名功能更加简洁!