gpt4 book ai didi

scala - 关于 Scala 闭包的问题(来自 "Programming in Scala")

转载 作者:行者123 更新时间:2023-12-04 05:27:50 25 4
gpt4 key购买 nike

我不明白为什么作者说“Scala 编程”中的代码 list 9.1 使用闭包。在第 9 章中,他们展示了如何从以下原始代码重构代码为更少重复的形式:

object FileMatcher {
private def filesHere = (new java.io.File(".")).listFiles
def filesEnding(query: String) =
for (file <- filesHere; if file.getName.endsWith(query))
yield file
def filesContaining(query: String) =
for (file <- filesHere; if file.getName.contains(query))
yield file
def filesRegex(query: String) =
for (file <- filesHere; if file.getName.matches(query))
yield file
}

到第二个版本:
object FileMatcher {
private def filesHere = (new java.io.File(".")).listFiles
def filesMatching(query: String,
matcher: (String, String) => Boolean) = {
for (file <- filesHere; if matcher(file.getName, query))
yield file
}
def filesEnding(query: String) =
filesMatching(query, _.endsWith(_))
def filesContaining(query: String) =
filesMatching(query, _.contains(_))
def filesRegex(query: String) =
filesMatching(query, _.matches(_))
}

他们说这里没有使用闭包。现在我明白了。然而,他们介绍了 的使用。关闭重构更多,如代码 list 9.1 所示:
object FileMatcher {
private def filesHere = (new java.io.File(".")).listFiles
private def filesMatching(matcher: String => Boolean) =
for (file <- filesHere; if matcher(file.getName))
yield file
def filesEnding(query: String) =
filesMatching(_.endsWith(query))
def filesContaining(query: String) =
filesMatching(_.contains(query))
def filesRegex(query: String) =
filesMatching(_.matches(query))
}

现在他们说 查询 是一个自由变量,但我真的不明白他们为什么这么说?由于 ""query""似乎从顶部方法向下传递到字符串匹配函数显式。

最佳答案

让我们看看 What is a closure 中的经典 add-n 闭包.

(define (add a)
(lambda (b)
(+ a b)))

(define add3 (add 3))

(add3 4) returns 7

在上面的 lambda 表达式中, afree variable ,在维基百科链接中定义为:

a variable referred to in a function that is not a local variable or an argument of that function. An upvalue is a free variable that has been bound (closed over) with a closure.



回到
def filesEnding(query: String) =
filesMatching(_.endsWith(query))

隐函数 x => x.endsWith(query)是一等函数,赋值为一等值 matcher , 和 _.endsWith()已关闭 query ,类似于 3 关闭的方式 a(add 3) . (add3 4)等效由 matcher(file.getName) 完成.

编辑 : 棘手的部分是 Scala 中称为占位符语法匿名函数的特性。通过使用 _代替发送者或参数,Scala 自动创建了一个匿名函数,我们可以将其视为 lambda 表达式。

例如,
_ + 1              creates       x => x + 1
_ * _ creates (x1, x2) => x1 * x2
_.endsWith(query) creates x => x.endsWith(query)

在函数内 x => x.endsWith(query) , query满足成为自由变量的两个要求:
  • query不是函数内定义的局部变量(没有局部变量)。
  • query不是函数的参数(唯一的参数是 x )。
  • 关于scala - 关于 Scala 闭包的问题(来自 "Programming in Scala"),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1083468/

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