gpt4 book ai didi

Scala 替代 pythons `with`

转载 作者:行者123 更新时间:2023-12-01 10:02:54 25 4
gpt4 key购买 nike

在 python 中,您可以避免使用 with 的 try {} catch {} finally {} 样板(参见 What is the python keyword "with" used for? )。我记得在 Scala 中看到过一个替代方案,但我再也找不到了。

它的思路是:

def using[O](r: {def close()})(doit: () => O): O = try {
doit()
} finally {
r.close
}

using(myWriter){() => myWriter.println("something or another")}

它是内置于 2.10 中,还是我需要一个单独的库?

最佳答案

制作自己的涵盖几乎所有用例(此处使用 2.10)几乎是微不足道的:

implicit class TidyUpAnything[A](val a: A) extends AnyVal {
def tidily[Z](g: A=>Any)(f: A=>Z) = try { f(a) } finally { g(a) }
}

如果您希望异常通过,请按原样使用:

scala> Option(null: String).tidily(println){_.get}   // Should print None
None
java.util.NoSuchElementException: None.get
at scala.None$.get(Option.scala:313)
...

如果您想处理异常,请将其与 scala.util.Try 结合使用:

scala> import scala.util._
scala> Try( Option(null: String).tidily(println){ _.get } )
None
res1: scala.util.Try[String] = Failure(java.util.NoSuchElementException: None.get)

通常你会让 g 变成类似 _.close 的东西,但你可以用它做任意的资源清理。例如,这里我们在完成时将计数器减一:

var i = 0
val a = Array(1,2)
a.tidily(_ => i -= 1){ _.foreach(_ => i += 1) }
scala> i
res2: Int = 1

关于Scala 替代 pythons `with`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15519017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com