1

我正在学习 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)
4

1 回答 1

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。第二个参数是一个匿名函数:接受一个参数source,在其主体中有一个语句println(source.mkString)并返回Unit

Scala 编译器自动source从方法定义和您提供的第一个参数 (a BufferedSource) 中检测类型。如果需要,您也可以重构该匿名函数并显式声明类型:

using(Source.fromFile("file"))(eg)
def eg(source: BufferedSource): Unit = println(source.mkString)

当然,匿名函数要简洁得多!

于 2013-06-02T13:32:40.673 回答