写点什么

使用 Ruby 1.9 实现方法串联

  • 2008-02-05
  • 本文字数:950 字

    阅读完需:约 3 分钟

关于tap方法的想法由来已经有些时日了——不过现在它已经在 Ruby 1.9 中被加入标准 Ruby 类库中。在Blog 上撰文阐述 tap方法背后想法的 MenTaLguY ,给出了下面的简单代码示例:

class Object<br></br> def tap<br></br> yield self<br></br> self<br></br> end<br></br>end在 Ruby 1.9 中,tap方法被定义在Object对象中,使得每一个 Ruby 对象默认都可以使用它。该方法以 Block 为参数,而 Block 又以self为参数,随后方法返回对象本身。

通过tap方法的间接调用看起来像对某个对象进行操作的一种复杂方式。当相应对象被从一个方法传递到另一个方法,而没有将这个对象赋给一个变量的时候,这种方式的有点才真正显现出来。不管方法 **** 串联与否,这种现象都是很常见的,在串联链长的时候尤其如此。

举例:没有 tap,必须多命名一个临时的变量

xs = blah.sort.grep( /foo/ )<br></br>p xs<br></br># do whatever we had been doing with the original expression <br></br>xs.map { |x| x.blah }有了tap以后:

blah.sort.grep( /foo/ ).tap { |xs| p xs }.map { |x| x.blah }这段代码展现了tap发挥威力之处:如果没有这个方法,我们就得把要用到的对象赋给一个局部变量才可以使用——使用了tap,就可以在串联代码的传递发生时插入Block 以进行对象的操作。这对于暴露了所谓的连贯接口(Fluent Interfaces)的 API 是非常有价值的——连贯接口就是指鼓励方法串联的API。以下是Martin Fowler 网站上的一个Java 范例

customer.newOrder()<br></br> .with(6, "TAL")<br></br> .with(5, "HPK").skippable()<br></br> .with(3, "LGV")<br></br> .priorityRush();为防止这样的代码出现了 Bug,tap允许通过简单插入一个tap的 Block,在任何阶段对对象进行观察(也就是在每一个调用之间)。对于调试工具这也是非常有用的,而调试工具常常不支持对方法的匿名返回值进行观察。

有一点很重要的问题需要提及:一般来说,tap主要是为了在无须改变对象的时候(Block 的返回值会被忽略)引发某些副效应。然而,只要对象是可变的,要改变这个对象也是理所当然可行的。

Rails ActiveSupport 的用户早就已经对其中一个类似的 returning方法耳熟能详了。

当然,tap方法并不仅限于 Ruby 1.9——Ruby 的 Open Classes 也允许开发人员在非 1.9 的 Ruby 版本中实现相同功能。

2008-02-05 06:301596
用户头像

发布了 117 篇内容, 共 21.2 次阅读, 收获喜欢 0 次。

关注

评论

发布
暂无评论
发现更多内容

YashanDB数据库实时监控平台建设经验分享

数据库砖家

攻击性威胁情报:红队视角下的CTI实战应用

qife122

红队 威胁情报 攻击模拟

YashanDB数据库升级过程中的数据兼容性处理方法

数据库砖家

YashanDB数据库升级流程及风险控制

数据库砖家

一步完成CalDAV账户同步,日历服务助力钉钉日历日程集中管理

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

YashanDB数据库设计最佳实践分享

数据库砖家

YashanDB数据库实现实时数据处理的技巧

数据库砖家

YashanDB数据库事务隔离级别与性能权衡

数据库砖家

YashanDB数据库数据备份策略及灾难恢复实战分享

数据库砖家

OpenAI GPT-Realtime 发布:支持 SIP、MCP、异步函数调用和副语言信息捕捉,但依然贵丨日报

RTE开发者社区

YashanDB数据库实现数据实时同步的技术路径

数据库砖家

YashanDB数据库事务隔离级别设置及影响

数据库砖家

YashanDB数据库生命周期管理全攻略

数据库砖家

YashanDB数据库实现跨平台数据同步的技术实践

数据库砖家

BigCache: Go 高性能内存缓存实现

俞凡

golang 架构

地平线具身智能算法H-RDT斩获CVPR 2025 RoboTwin真机赛冠军

地平线开发者

自动驾驶 地平线征程6 机器人展会

YashanDB数据库入门教程:搭建与优化的实用指南

数据库砖家

YashanDB数据库入门指南:快速搭建与配置流程

数据库砖家

大数据-82 Spark 集群架构与部署模式:核心组件、资源管理与调优

武子康

Java 大数据 flink spark 分布式

卡片一放,服务直达!实现信息零层级触达

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

YashanDB数据库事务隔离级别调优技巧

数据库砖家

YashanDB数据库事务日志分析及疑难排查教程

数据库砖家

YashanDB数据库生命周期管理最佳实践

数据库砖家

YashanDB数据库事务日志管理实用教程

数据库砖家

YashanDB数据库事务管理及并发控制实战

数据库砖家

搭建一面LED广告墙的总成本解析

Dylan

广告 LED LED display LED显示屏 LED屏幕

2025年 华为鸿蒙创新赛比赛流程 全攻略

万少

HarmonyOS

云闪付联合HarmonyOS SDK打造更便捷安全的支付体验

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

YashanDB数据库如何助力企业数字化转型

数据库砖家

YashanDB数据库入门教程:轻松掌握核心功能

数据库砖家

书写不再“断片”!Pen Kit报点预测丝滑如真笔

HarmonyOS SDK

HarmonyOS NEXT HarmonyOS SDK应用服务

使用Ruby 1.9实现方法串联_Ruby_Werner Schuster_InfoQ精选文章