写点什么

使用 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:301156
用户头像

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

关注

评论

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

如何挑选符合你需求的任务管理工具

爱吃小舅的鱼

待办事项管理

大数据处理与智慧营销系统性能优化

鲸品堂

大数据 营销 流程化 企业号2024年8月PK榜

coconutBattery Plus:苹果mac电脑 电池健康检测工具

Rose

揭示低代码与AI结合的商业价值

天津汇柏科技有限公司

人工智能 低代码

扬帆蓝海,智起未来!和鲸科技助力第十三届全国海洋航行器设计与制作大赛智能感知赛道精彩收官!

ModelWhale

小小的引用计数,大大的性能考究

bin的技术小屋

Netty Java' netty

倒计时3天!数智时代下大数据应用的“道”与“术”闭门会议即将开幕

望繁信科技

数字化转型 流程挖掘 流程智能 智能化应用

Downie 4 for Mac(视频下载工具)兼容14系统 v4.7.26中文版

理理

Complete Anatomy for Mac 3D医学软件免费版 支持M1/M2

理理

机器人测试自动化智能化交流沙龙 —免费参与,线上线下同步进行

测试人

软件测试

企业数据怎么定义?包含哪些?如何保护企业数据?

行云管家

数据安全 企业数据安全 企业数据

简历,需要和求职岗位匹配

老张

裁员 职场成长 求职面试

mac防火墙软件Radio Silence 完整激活版 支持M1/M2

Rose

Parallels Desktop 19完美破解版 附PD虚拟机永久密钥

Rose

Parallels Desktop 19 Parallels虚拟机下载 Mac虚拟机安装 PD19密钥

IntelliJ IDEA中文版安装教程 附IntelliJ IDEA永久激活码2024最新

Rose

代码编辑 IntelliJ IDEA中文版 IntelliJ IDEA2024安装 intellij idea激活码2024

泉州等保测评机构电话是多少?在哪里?

行云管家

等级保护 等保测评 泉州

量化交易炒币机器人系统开发策略指南/步骤需求/案例设计/源码版

V\TG【ch3nguang】

天猫商品详情API:深度挖掘商品推荐与关联的新路径

代码忍者

API 接口 API 测试

统一多场景自动编译加速

百度Geek说

编译器 百度飞桨

LED单色显示屏未来发展的3个困难点

Dylan

技术 LED显示屏 全彩LED显示屏 led显示屏厂家 市场

6 个Spring tx 事务注解:4种隔离&7种事务传播业务案例(必须收藏)

肖哥弹架构

Java spring 注解

监理单位项目管理系统选型必看指南

爱吃小舅的鱼

项目管理

一站式系统清理维护工具MacBooster 8 Pro Mac中文版

Rose

苹果电脑系统优化 MacBooster 8 Pro 系统清理维护 MacBooster 破解版

如果提议者提议区块的时间晚了,会对见证有何影响?

TechubNews

必看!文档版本管理工具大比拼

爱吃小舅的鱼

文档管理

香城档案利用 NocoBase 快速实现智能档案管理

NocoBase

低代码 无代码 档案管理

新手指南:轻松选择生产工时管理系统

爱吃小舅的鱼

工时管理

身份管理“六边形战士”闪亮登场

芯盾时代

身份安全 iam 统一身份认证 身份和访问管理

探索HarmonyOS位置服务:为用户提供直观的坐标显示

白晓明

HarmonyOS HarmonyOS NEXT 位置服务 地理编码转化 逆地理编码转化

如何做好API安全

德迅云安全杨德俊

fxfactory视觉特效下载 FxFactory 8 Pro mac破解资源

Rose

FxFactory Pro 8 fxfactory视觉特效

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