Ruby 中的块和过程

2023-11-20

我已经开始学习 Ruby,读了一些教程,甚至买了一本书(《Programming Ruby 1.9 - The Pragmatic Programmers' Guide》),我遇到了一些我以前在任何课程中都没有见过的新东西。我知道的其他语言(我是一名 PHP 网络开发人员)。

块和过程。 我想我明白它们是什么,但我不明白的是为什么它们如此伟大,以及何时以及为什么我应该使用它们。 我到处都看到他们说块和过程是 Ruby 中的一个很棒的功能,但我不明白它们。

这里有人能给像我这样的 Ruby 新手一些解释吗?


块有很多优点。电梯游说:街区让我们四处走动actions就像我们平常传递的方式一样data.

最明显的层面是,它们让您可以将事物抽象为其他方式不可能实现的函数。例如,让我们看一个常见的情况,您有一个事物列表,并且您希望对其进行过滤以仅包含符合某些条件的项目:

int list[50] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50};
int evenNumbers[50] = {0};
int copyIndex = 0;
for (int i = 0; i < 50; i++) {
    if (list[i] % 2 == 0) {
        evenNumbers[copyIndex++] = list[i];
    }
}

下面是用 Ruby 编写的方法:

list = 1..50
listCopy = list.select {|n| n.even?}

所有常见的繁忙工作都从代码中移出并转移到具有有意义名称的方法中。我们不关心复制数组和遍历索引等等——我们只想要一个过滤后的列表。就是这样select给我们。该块允许我们将自定义逻辑传递到这个标准方法中。

但迭代器并不是唯一的地方“中间有洞图案”很有用。例如,如果您将一个块传递给File.open,它将打开该文件,执行该文件的块,然后为您关闭该文件。

块给我们带来的另一件事是一种非常强大的回调形式。例如,如果没有块,我们可能必须做这样的事情(基于对话框在 Objective-C Cocoa 中的实际工作方式):

class Controller
  def delete_button_clicked(item)
    item.add_red_highlight
    context = {:item => item}
    dialog = Dialog.new("Are you sure you want to delete #{item}?")
    dialog.ok_callback = :delete_OK
    dialog.ok_receiver = self
    dialog.cancel_callback = :cancel_delete
    dialog.cancel_receiver = self
    dialog.context = context
    dialog.ask_for_confirmation
  end

  def delete_OK(sender)
    delete(sender.context[:item])
    sender.dismiss
  end

  def cancel_delete(sender)
    sender.context[:item].remove_red_highlight
    sender.dismiss
  end
end

尤扎。使用块,我们可以这样做(基于许多 Ruby 库中使用的常见模式):

class Controller
  def delete_button_clicked(item)
    item.add_red_highlight
    Dialog.ask_for_confirmation("Are you sure you want to delete #{item}?") do |response|
      response.ok { delete item }
      response.cancel { item.remove_red_highlight }
    end
  end
end

这实际上是两层块——do...end块和两个{}风格的块。但它读起来很自然,不是吗?这是有效的,因为块捕获了它创建的上下文,所以我们不需要传递self and item.

至于 Procs,它们只是块的对象包装器。对他们来说不是很多。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ruby 中的块和过程 的相关文章

  • Ruby 中多维数组的帮助

    我有以下代码将字符串拆分为 3 个字节的组 str hello ix 0 iy 0 bytes tby str each byte do c if iy 3 iy 0 bytes ix tby each index do i bytes i
  • 如何在 Rails 控制器中调用通道方法?

    我有一个订阅用户的 ActionCable 方法 如果启动新的 convo 我也希望用户订阅新频道 我无法找出在控制器中调用通道方法的正确语法 更新 问题是消息在发送时附加到聊天框 但是当发送第一条消息时 Websocket 连接尚未建立
  • Ruby 中的并行赋值运算符

    我正在查看 Ruby 编程 书中的一个示例 def fib up to max i1 i2 1 1 parallel assignment i1 1 and i2 1 while i1 lt max yield i1 i1 i2 i2 i1
  • yard 0.7.3 无法在 Markdown 和 Textile 中构建我的自述文件

    我决定将我的项目中的 README 文件转换为 Markdown 并一直使用yard 验证文档是否正确呈现 所以我安装了 rdiscount 将 README 更改为 README md 并尝试 yard doc README md 这给了
  • Rails 4:资产未在生产中加载

    我正在尝试将我的应用程序投入生产 但图像和 CSS 资源路径不起作用 这是我目前正在做的事情 图像资源位于 app assets images image jpg 样式表位于 app assets stylesheets style css
  • Rails 控制台无法运行

    rbenv 红宝石版本 2 6 6 导轨版本 5 1 4 我正在较旧的代码库中工作 ruby 2 6 6 rails 5 4 1 这是我每天使用的代码库 我必须通过 rbenv 下载一个新的 ruby 版本作为单独的存储库 这样做在我的旧代
  • 使用 VCR 过滤敏感数据

    我正在使用 VCR gem 记录 http 交互并在将来重播它们 我想过滤掉 uri 请求中的实际密码值 以下是 uri 的示例 http services somesite com Services asmx Cabins Usernam
  • 多重要求和允许强参数rails 4

    在下面的情况下 我尝试使用强参数 我想要求email address password并允许remember me fields 但像下面这样使用它只允许最后一行在方法示例中 在下面的情况下 它只需要params permit rememb
  • 如何从 ruby​​ 中的字符串中删除所有非数字?

    用户输入数字的形式如下 1 800 432 4567 800 432 4567 800 432 4566 800 432 4567 1 800 432 4567 800 432 4567 我希望所有这些都变成没有特殊字符的剥离版本 例如18
  • rvm gem 安装错误?

    我正在摆弄 ruby gems 和 rvm 它工作得很好 但现在当我尝试安装 gem 时出现错误 gem install Rails错误 同时 执行 gem Errno EACCES 权限被拒绝 Users da rvm gems ruby
  • 在 Ruby 中创建一个空文件:相当于“touch”?

    创建一个的最佳方式是什么emptyRuby 中的文件 类似于 Unix 命令的东西 touch https en wikipedia org wiki Touch 28Unix 29 touch file txt FileUtils tou
  • Ruby/Rails 集合到集合

    我有两个表与一个连接表连接 这只是伪代码 Library Book LibraryBooks 我需要做的是 如果我有一个图书馆的 id 我想获取该图书馆拥有的所有书籍所在的所有图书馆 因此 如果我有图书馆 1 图书馆 1 中有书籍 A 和
  • Ruby 是否有一个 Expect 等效 gem?

    Ruby 是否有一个 Expect 等效 gem 我尝试在 code google 和 ruby gems org 上搜索 但遗憾的是它没有出现 FYI Expect http en wikipedia org wiki Expect是一个
  • 为 RoR 中的每个用户创建新的 URL 路径

    如何在 Ruby on Rails 中实时创建新的 URL 路径 例如 我希望我的用户拥有 name XXX com 或 XXX com name 仅供参考 我在 Heroku 上托管代码 看看 subdomain fu 插件 https
  • 比较 ruby​​ 哈希值[重复]

    这个问题在这里已经有答案了 可能的重复 如何比较两个哈希值 https stackoverflow com questions 4928789 how do i compare two hashes 我有两个 ruby 哈希值 本质上是模型
  • 如何处理 Nokogiri 中的 404 未找到错误

    我正在使用 Nokogiri 来抓取网页 很少有 url 需要猜测 当它们不存在时 会返回 404 未找到错误 有没有办法捕获这个异常 http yoursite page 38475 gt page number 38475 doesn
  • Rails 3.2:用 json 序列化中的空字符串替换 null 值

    我正在使用 Rails 3 2序列化 http www simonecarletti com blog 2010 04 inside ruby on rails serializing ruby objects with json 将 ru
  • Ruby ActiveRecord 和 sql 元组支持

    ActiveRecord 是否支持 where 子句中的元组 假设底层数据库支持 结果 where 子句看起来像这样 where name address in John 123 Main St I tried Person where n
  • Ruby 动态变量名

    有没有办法在 Ruby 中创建具有动态名称的变量 我正在读取一个文件 当我找到一个字符串时 会生成一个哈希值 e g file File new games log r file lines do l l split do p if p 1
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in

随机推荐

  • SwiftUI/Combine:订阅@Binding的值变化

    我有一个带有视图模型的视图 该视图中的操作可以更改视图模型 为了能够将逻辑分解为可重用的部分 我将视图的一部分作为其自己的视图 并对其所需的值使用 Binding 现在 我希望能够根据值更改执行一些逻辑 而不必只是视图更改 我怎样才能做到这
  • 如何使用多个命令启动 cmd.exe /k?

    为什么下面的代码不改变颜色和标题cmd2 怎么做以及做什么 该命令改变颜色cmd1 并将标题设置为cmd2 start cmd exe k TITLE TEST color 02 mode con cols 160 lines 78 sta
  • Android 序列化问题

    我创建了一个类 它有几个成员变量 所有这些变量都是可序列化的 除了一个位图 我尝试扩展位图并实现可序列化 但不认为位图是最终类 我想保存该类 它基本上构成了游戏的当前状态 以便玩家可以拾取并加载游戏 在我看来 我有两个选择 1 寻找另一种保
  • 如何为 java HttpURLConnection 流量启用线路日志记录?

    我用过雅加达公共 HttpClient在另一个项目中 我也想要同样的电线记录输出但使用 标准 HttpUrlConnection 我用过Fiddler作为代理 但我想直接从 java 记录流量 捕获连接输入和输出流的内容是不够的 因为 HT
  • 如何根据 Wavefront (.obj) 文件中给出的纹理索引对纹理位置进行排序?

    我目前正在尝试为 OpenGL 项目制作一个 Wavefront obj 文件加载器 我当前使用的方法是逐行分离向量 std vectors 中的顶点位置 纹理位置和法线位置 并且我将它们的索引 顶点 纹理和法线索引 存储在三个单独的文件中
  • Kivy ObjectProperty 更新标签文本

    我正在创建一个 kivy 用户界面来显示由我编写为标准 python 对象的数据模型生成的值 本质上 我希望用户能够按下一个按钮 这将更改底层数据模型 并且此更改的结果将自动更新和显示 据我了解 这可以使用 kivy 属性 在本例中为 Ob
  • 允许Html不工作

    我正在构建一个内容管理系统 以允许我以外的人更新网站上的内容 我有一个前端 HTML 表单 它通过 AJAX 将数据发送到控制器 CONTROLLER ValidateInput false public void CarAJAX CarA
  • 获取文本框值的VBA/宏代码

    Sub CopyRandomRows Windows sample rnd xlsm Activate Rows 1 1 Select Selection Copy Application CutCopyMode False Selecti
  • AWS/EKS:从 ALB 频繁收到 504 网关超时错误

    我正在使用 EKS 部署服务 入口在 alb ingress controller 之上运行 总而言之 我有大约 10 个单个 Pod 的副本 具有单一服务类型NodePort它将流量转发给他们 副本在 10 个节点上运行 使用 eksct
  • 检测用于 HttpClient POST 或 GET 调用的 TLS 版本

    我正在尝试检索 TLS 版本信息 下面的代码使用 HttpClient 成功进行了 HTTP GET 调用 我缺少什么 我在哪里可以从 HttpClient 获取 TLS 版本信息 我正在做与建议相同的事情协商了哪个 TLS 版本 但这是特
  • 获取已打印的python文本内容

    假设我打印以下代码 print THE RUSSIAN PEASANT ALGORITHM times two values x and y together x int raw input raw input x y int raw in
  • 如何使用 jQuery 加载本地文件? (带有文件://)

    有没有办法使用 jQuery 从数据文件 例如 JSON js 文件 加载数据 eg get file C objectData js function alert Load was performed 目前 JQuery 似乎没有执行简单
  • 将 Graph API 中 Facebook 访问令牌的有效期延长至 2 个月以上

    我正在使用 python 开发 Facebook 页面墙贴自动化 我通过使用自动在我拥有的 Facebook 页面上发帖Facebook 图表 API 帖子所以我通过发送 HTTP POST 请求来做到这一点https graph face
  • System V IPC 与 POSIX IPC

    两者有什么区别System V IPC and POSIX IPC 为什么我们有两个标准 如何决定使用哪些IPC功能 两者都有相同的基本工具 信号量 共享内存和消息队列 它们提供的界面与这些工具略有不同 但基本概念是相同的 一个显着的区别是
  • 如何转义 WPF 绑定路径中的斜杠字符,或者如何解决?

    我刚刚学习 WPF 我将一个表从数据源拖到一个为每列生成 XAML 的窗口上 其中一些列的名称会导致以下情况
  • 如何反汇编原始 16 位 x86 机器代码?

    我想反汇编我拥有的可启动 x86 磁盘的 MBR 前 512 字节 我已使用以下命令将 MBR 复制到文件中 dd if dev my device of mbr bs 512 count 1 对可以反汇编该文件的 Linux 实用程序的任
  • 在android中上传多个图像到服务器的最快方法

    我有多个图像要在服务器中上传 并且我有一种将单个图像上传到服务器的方法 现在我使用此方法通过为每个图像创建循环来发送多个图像 有没有最快的方法将多个图像发送到服务器 提前致谢 public int imageUpload GroupInfo
  • Xlib:XGetWindowAttributes 始终返回 1x1?

    我想要当前聚焦窗口的宽度和高度 窗口的选择就像一个魅力 而高度和宽度是always返回 1 include
  • 在虚拟列表达式中连接数字会引发 ORA-12899: 值对于列来说太大

    当我给出这个时answer昨天的一个问题 我建议使用虚拟栏目用于计算值而不是手动更新它 我自己做了一个测试 发现了虚拟列表达式在执行时所需的数据大小的问题连接 two NUMBER类型列 不过 连接两个字符时没有问题 数据库版本 SQL g
  • Ruby 中的块和过程

    我已经开始学习 Ruby 读了一些教程 甚至买了一本书 Programming Ruby 1 9 The Pragmatic Programmers Guide 我遇到了一些我以前在任何课程中都没有见过的新东西 我知道的其他语言 我是一名