关于Scala闭包的问题(来自《Scala编程》)

2024-02-06

我不明白为什么作者说“Scala 编程”中的代码清单 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(_))
}

他们说这里没有闭包的用处。现在我明白了。然而他们引入了使用closure进行更多重构,如清单 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是一个自由变量,但我不太明白他们为什么这么说?由于“查询”似乎是从顶部方法显式传递到字符串匹配函数。


让我们看一下经典的 add-n 闭包什么是闭包 https://stackoverflow.com/questions/36636/what-is-a-closure.

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

(define add3 (add 3))

(add3 4) returns 7

在上面的 lambda 表达式中,a is the 自由变量 http://en.wikipedia.org/wiki/Free_variables_and_bound_variables,在维基百科链接中定义为:

函数中引用的变量 这不是局部变量或 该函数的参数。升值 是一个已绑定的自由变量 (封闭)有一个封闭物。

回到

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

隐式函数x => x.endsWith(query)是一等函数,被分配给一等值matcher, and _.endsWith()已关闭query,类似于3关闭的方式a in (add 3). (add3 4)相当于由matcher(file.getName).

Edit:棘手的部分是 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满足成为自由变量的两个要求:

  1. query不是函数内定义的局部变量(没有局部变量)。
  2. query不是函数的参数(唯一的参数是x).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于Scala闭包的问题(来自《Scala编程》) 的相关文章

  • 如何插入UUID的值?

    我在 Play Framework 2 3 支持的 postgresql 9 4 中使用 anorm 2 4 给出一个这样的模型 case class EmailQueue id UUID send from String send to
  • 如何将 csv 文件读取为键值对的映射

    我的 csv 文件中有数据 例如 value key A Name B Name C Name 24 Age 25 Age 20 Age M Gender F Gender 我想解析它以生成以下地图 Map Name gt List A B
  • Scala 中的超时未来

    假设我有一个函数 它调用一个阻塞可中断的手术 我想在超时的情况下异步运行它 也就是说 我想在超时到期时中断该功能 所以我正在尝试做这样的事情 import scala util Try import scala concurrent Fut
  • Scala+Slick 3:将一个查询的结果插入到另一张表中

    这个问题是关于 slick 3 0 或 3 1 的 我对此很灵活 我有一个中间查询 我用它来处理map for等等以获得我想要的结果 最后我有一个 val foo DBIOAction Seq MySchema Bar NoStream E
  • Spark SQL中如何按列降序排序?

    I tried df orderBy col1 show 10 但它是按升序排列的 df sort col1 show 10 也按升序排序 我查看了 stackoverflow 发现的答案都已过时或称为 RDD https stackove
  • 组合多个任意长度的列表

    我正在寻找一种通过以下方式加入多个列表的方法 ListA a b c ListB 1 2 3 4 ListC Resulting List a 1 b 2 c 3 4 换句话说 元素按顺序排列 从第一个列表开始组合到结果列表中 任意数量的输
  • Scala 函数定义参数列表中不同的括号样式

    Scala 中以下两个函数定义有什么区别 1 def sum f Int gt Int a Int b Int Int code 2 def sum f Int gt Int a Int b Int Int code SBT 的控制台 RE
  • 组合部分函数

    我有两个偏函数f and g 它们没有副作用并且执行速度快 将它们组合成另一个部分函数的最佳方法是什么h这样h isDefinedAt x iff f isDefinedAt x g isDefinedAt f x 如果h是一个返回一个函数
  • scala.concurrent.blocking - 它实际上做了什么?

    我花了一段时间学习 Scala 执行上下文 底层线程模型和并发性的主题 你能解释一下通过什么方式吗scala concurrent blocking 调整运行时行为 and 可以提高性能或避免死锁 如中所述scaladoc http www
  • scala 中的模拟案例类:Mockito

    在我的游戏应用程序中 我打算模拟一个案例类 我可以这样做 但它创建了一个所有成员变量都为空的对象 有没有办法创建案例类的模拟对象 以便该对象可以初始化一些成员 case class User name String address Stri
  • Scala - lambda 参数可以匹配元组吗?

    所以说我有一些清单 比如 val l List 1 blue 5 red 2 green 然后我想过滤掉其中一个 我可以做类似的事情 val m l filter item gt val n s item unpack the tuple
  • 如何通过 Scala REPL 使用第三方库?

    我已经下载了Algebird我想尝试一些事情Scala 解释器使用这个库 我该如何实现这一目标 当然 您可以使用 scala cp 无论如何并手动管理您的依赖项 但这变得非常乏味 尤其是当您有多个依赖项时 更灵活的方法是使用sbt http
  • 在 scala 中保留推导的更高类型

    我有一个高阶类型 并致力于用它构建一些 DSL 我正在寻找一种方法来定义可以接受类型而无需显式指定此类型的函数 自我描述示例 class Wrap T val data T class DSL def doSomething T x Wra
  • Scala:需要类类型,但找到了 T

    我发现了与此特定问题类似的问题 但是该问题是由于有人试图直接实例化 T 造成的 在这里 我试图创建一个特征 它是一个通用接口来扩展类并将它们自动存储在数据库中 例如 Riak 使用classOf T 使用 Scala 2 10 这是我的代码
  • 为什么 Cassandra 客户端在生产中没有 epoll 时会失败? [复制]

    这个问题在这里已经有答案了 当我在本地运行服务时 我收到一条警告 指出 epoll 不可用 因此它使用 NIO 很公平 当我将其部署到 Kubernetes 中时 我得到了以下信息 这导致服务无法运行 2017 03 29T19 09 22
  • Scala Sparkcollect_list() 与 array()

    有什么区别collect list and array 在 Spark 中使用 scala 我看到到处都有使用情况 但我不清楚用例来确定差异 尽管两者array https spark apache org docs latest api
  • 在 Spark 中将流式 XML 转换为 JSON

    我是 Spark 新手 正在开发一个简单的应用程序 将从 Kafka 接收的 XML 流转换为 JSON 格式 Using 火花2 4 5 斯卡拉 2 11 12 在我的用例中 kafka 流采用 xml 格式 以下是我尝试过的代码 val
  • 用 HashMap[Int, Vector[Int]] (Scala) 表示图(邻接列表)?

    我想知道如何 如果可能的话 我可以通过以下方式制作 可变 图的邻接列表表示HashMap Int Vector Int HashMap当然是可变的 目前我将其设置为HashMap Int ArrayBuffer Int 但我可以更改 Arr
  • Swift try inside Objective-C 块

    我需要创建一个函数foo它接受一个抛出闭包作为参数 我可以使用 Swift 或 ObjC 来实现它 但我需要能够从两者中调用它 像这样 Swift func bar throws func foo block throws gt void
  • 在 Spark 中将多行汇总为单行和单列

    我有一个如下的火花 DF 我需要汇总具有与单行相同 ID 的多行 但值应该不同 id values 1 hello 1 hello Sam 1 hello Tom 2 hello 2 hello Tom 预期输出 id values 1 h

随机推荐

  • 在 WHERE 子句中使用别名

    我有一个查询 旨在显示表 A 中最近尚未更新的任何行 每行应在 month no 之后的 2 个月内更新 SELECT A identifier A name TO NUMBER DECODE A month no 1 200803 2 2
  • 从word文档中逐行读取

    我正在尝试使用 C 阅读 Word 文档 我能够获取所有文本 但我希望能够阅读逐行 and 存储在列表中并绑定到 gridview 目前 我的代码返回仅包含所有文本的一项的列表 不是根据需要逐行 我正在使用Microsoft Office
  • 可以为节点应用程序安装所有缺少的模块吗?

    我有一个刚刚开始使用的节点应用程序 每次我尝试运行它时 它都会说缺少模块 我刚刚使用过npm install 对于每个模块 但在完成大约 10 个模块之后 我想知道是否有一种方法可以让 npm 拉取节点应用程序所需的所有模块 而无需我手动安
  • Swift:无法创建嵌套枚举类型的空数组

    我试图声明在另一个类中定义的空枚举数组 如下所示 但出现以下错误 class OuterClass enum MyEnum case ThingOne case ThingTwo Error Invalid use of to call a
  • 检查是否是类对象

    python 中是否可以检查一个对象是否是类对象 IE 如果你有 class Foo object pass 如何检查 o 是 Foo 或其他类 还是 Foo 的实例 或任何其他类实例 在 Java 中这将是一件简单的事情 只需检查该对象是
  • Visual Studio 2015 调试:无法扩展局部变量?

    我正在使用 Visual Studio 2015 预览版 并且正在尝试调试我的项目 我之前使用的是 VS 2012 并且很大程度上依赖于能够将鼠标悬停在局部变量上并展开以查看它们的值 我现在正尝试在 2015 年执行此操作 但是当我将鼠标悬
  • 如何自动有序排列Referencing Outlet Collection中的商品?

    我在 Xib 中将 UITextfields 的引用 Outlet Collection 排列为一个在另一个之下 当我打印Referencing Outlet Collection时 我发现它是无序的 我需要自动排列文本字段 即文本 fil
  • kubernetes v1.7.1 kubeadm join 主机名“”无法到达错误

    今天 当我运行以下命令时 我使用 v1 7 1 重新创建了集群kubeadm join token 189518 c21306e71082d6ec命令 它给出以下错误 这使用了以前版本的 kubernetes 中的工作 这个版本有什么变化吗
  • 您可以在 Next.js API 中保持 PostgreSQL 连接处于活动状态吗?

    我正在将 Next js 用于我的业余项目 我有一个托管在 ElephantSQL 上的 PostgreSQL 数据库 在 Next js 项目中 我使用 apollo server micro 包设置了 GraphQL API 在设置 G
  • 正向填充 R data.table 中 NA 的第一个实例

    我有一个 data table 其中有一列 c 58 NA NA NA NA 13 NA NA NA 12 23 NA 12 我想通过转发最后一个值来仅填充列中每个非 NA 值后面的前两个 NA 结果应该是 c 58 58 58 NA NA
  • 在 Windows 控制台中从 Java 代码问题打印出 unicode

    我在 Windows 控制台中打印 unicode 符号时遇到问题 这是打印出 unicode 符号值的 java 代码 System out print u22A2 当我在 Eclipse 中使用编码设置为 UTF 8 运行程序时 问题不
  • 向标准 Inno Setup 页面添加额外的控件?

    如何将复选框添加到 Inno Setup 创建的文件夹选择对话框中 如下图所示 这不是自定义对话框 它是由 Inno Setup 自动创建的 Set the Parent复选框的属性WizardForm SelectDirPage var
  • 实体框架性能调优

    我们正在使用实体框架来查询 SQL Server 数据库 LINQ 表达式是 IQueryable 该查询的执行时间大约为 10 秒 如果这是在存储过程中 我会使用查询来提高效率 但是 如果我使用 IQueryable 实体框架本身是否决定
  • 使用 awk 打印每隔一个字段

    我有以下输入文件 我希望打印每隔一个字段 A 1 B 2 C 3 获得以下输出 1 2 3 我努力了 awk BEGIN FS OFS for i 2 i lt NF i 2 print i input file 这显然行不通 我认为我的
  • 全局 alt+space 热键抓取 - 奇怪的键盘焦点行为

    我正在抓Alt Space全局热键使用xcb grab key 如下 xcb key symbols t keysyms xcb key symbols alloc c xcb keycode t keycodes xcb key symb
  • 如何在 DirectoryInfo.EnumerateFiles 完成之前访问它

    在我问的问题中快速检索文件夹和所有子文件夹中的文件名列表 https stackoverflow com questions 10604830 retrieve a list of filenames in folder and all s
  • JSON:c# 中的 java Map 等价物是什么

    我面临的问题是使用 JSON 将对象传递给 C 然后 C 将字符串传递回 Java 然后 java 将其反序列化为 Map 顺便说一句 net 版本是 3 5 这是问题所在 java 地图 JSON 字符串的格式如下 key1 value1
  • 使用正则表达式消除谷歌应用程序脚本中的换行符

    我正在尝试为 Google Docs 编写一个附加组件的一部分 该附加组件可以使用以下命令消除所选文本中的换行符replaceText 显而易见的text replaceText n 给出错误Invalid argument searchP
  • 从数组反应本机生成时,多个开关(切换)会同时启用

    现在我的构造函数中有一个像这样的数组 words test test test 在渲染内部 我想为每个元素生成一个带有文本和开关 切换 的元素 如下所示 const wordList this state words map item i
  • 关于Scala闭包的问题(来自《Scala编程》)

    我不明白为什么作者说 Scala 编程 中的代码清单 9 1 使用闭包 在第 9 章中 他们展示了如何将原始代码重构为更少重复的形式 object FileMatcher private def filesHere new java io