【问题标题】:Custom 'using' control structure in ScalaScala中的自定义“使用”控制结构
【发布时间】:2013-05-28 04:36:04
【问题描述】:

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

【问题讨论】:

  • AFAIK 不,因为您使用的是“来源:在不同的范围内,而不是您声明的范围内))但是您可以使用 for 理解来执行此操作(单子),以及类似 CPS 的样式您在上面发布的内容对我来说已经足够好了。

标签: scala functional-programming


【解决方案1】:

正如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)

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

【讨论】:

    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多