写点什么

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

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

关注

评论

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

【数据结构实践】手把手带你简单实现Python自定义栈

迷彩

数据结构 算法 堆栈 8月月更

英特尔联手产业伙伴打造绿色、低碳、智能数据中心

科技之家

InfoWorld文章丨将数据编排技术用于AI模型训练

Alluxio

人工智能 机器学习 数据平台 Alluxio 8月月更

招行架构师徐佳航:金融云原生与开源标准的共同生长

阿里巴巴云原生

阿里云 开源 容器 云原生 KubeVela

Python自学笔记6-列表有哪些常用操作

和牛

Python 测试 8月月更

如果重新学计算机

价投小邱

Linux 计算机网络 操作系统

「Java」本地文件上传下载预览

价投小邱

文件 下载 文件上传 #java

探秘苹果、微软、谷歌操作系统视觉设计,原来…

鼎道智联

ios windows UI 操作系统 视觉交互

如何用文字让 ta 动心?

图灵教育

李小龙的话道出了移动端“小程序化”的核心——似水无形

FinClip

Kyligence 助力重庆银行获 IDC FinTech 突破奖认可

Kyligence

数据分析 智能多维数据库

Flink+ice 实现可视化规则编排与配置(Demo)

waitmoon

flink 规则引擎使用 规则引擎 CEP 编排系统

浅聊一下邮件通知的批量推送

为自己带盐

dotnetcore 8月月更 邮件发送

“小程序化”如何助力智慧产业园区建设破题?

FinClip

开发制作数字藏品app原理

开源直播系统源码

NFT 数字藏品 数字藏品开发 数字藏品系统

以PostgreSql为例,说明生产级别数据库安装要考虑哪些问题?

字母哥哥

数据库 postgresql Linux

商派oneX新零售系统上架华为云云商店,首次参与“828企业节”

神奇视野

Java更改 PDF 页面大小

在下毛毛雨

喜报 | 博睿数据两项发明专利获得国家知识产权局授权,累计发明专利11项

博睿数据

APM 可观测性 博睿数据 智能运维AIOps 发明专利

万物皆可集成系列:低代码释放用友U8+深度价值(3)— 数据融合应用

葡萄城技术团队

追一科技携手华为云助力中小企业数字化,Face虚拟数字人亮相828企业节

sofiya

C#/VB.NET:删除PDF文档中的页面

Geek_249eec

C# VB.NET 删除PDF页面

DevSecOps | 极狐GitLab 动态应用程序安全测试(DAST)使用指南

极狐GitLab

DevOps gitlab 运维 测试 CI/CD

4 天 7 条 PR,80% 代码覆盖率,开源是「内卷」还是修炼?

腾源会

开源 腾源会 开源摘星计划

世界人工智能大会阿里巴巴专场论坛《数字时代的技术责任》来了!

阿里技术

英特尔CEO帕特·基辛格:以先进计算和封装创新,满足数字时代算力需求

科技之家

“中国建筑业竞争力百强”中化二建如何做知识管理?

sofiya

Logstash

平凡人生

一文搞懂 SAE 日志采集架构

阿里巴巴云原生

阿里云 Serverless 云原生

如何用文字让 ta 动心?

图灵社区

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