在Scala中自定义“使用”控件结构

时间:2013-06-01 12:39:41

标签: scala functional-programming

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

1 个答案:

答案 0 :(得分:2)

正如vitalli所暗示的那样,简短的答案是否定的(遗憾的是)。希望如果我解释你在Pollak的书中找到的方法定义和调用,那么它将变得清晰。

 def using[A <: { def close() }, B](closable: A)(body: A => B): B 

此using方法定义有两个参数列表(请参阅currying)。两个列表都有一个参数。第一个参数是可关闭的对象(类型A)。第二个是从AB的函数。

使用此行调用方法时:

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)

但是,当然,匿名功能更加简洁!