AI实践哪家强?来 AICon, 解锁技术前沿,探寻产业新机! 了解详情
写点什么

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

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

关注

评论

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

吉他初学者入门教程:Guitar Pro是如何帮助我从入门到大成的?

阿拉灯神丁

五线谱 吉他学习 吉他谱 Guitar Pro8 乐谱制作

用友BIP企业AI全栈云:为中企出海筑牢全球化运营底座

用友BIP

错误码502终结指南:3步根除MCP加载失败难题​​

聚客AI学院

人工智能 MCP MCP协议 MCP Server MCP头号玩家

巧用YashanDB数据库实现海量数据快速查询

数据库砖家

如何高效使用YashanDB数据库的日志系统?

数据库砖家

如何进行YashanDB的安全审计

数据库砖家

引领国资监管新变革——国资国企穿透式监管白皮书重磅来袭

用友BIP

Java集合框架性能特征与使用场景深度解析

不在线第一只蜗牛

Java

开放YashanDB数据库的功能与特性介绍

数据库砖家

iCourt重启“律师大航海”计划,2024年美国行扬帆起航

科技汇

一颗车灯的智能化之旅

脑洞汽车

AI

订单初版—取消订单链路中的技术问题说明文档

量贩潮汐·WholesaleTide

Java 数据库 服务器

对初学者来说,YashanDB数据库的学习路线图

数据库砖家

快速入门YashanDB数据库:安装配置全流程

数据库砖家

如何高效利用YashanDB提升数据管理能力

数据库砖家

容量规划与扩展策略:YashanDB数据库企业应用

数据库砖家

MySQL为什么有时候会选错索引?

电子尖叫食人鱼

MySQL 数据库

从语音识别到智能助手:Voice Agent 的技术进化与交互变革丨Voice Agent 学习笔记

声网

这5种规则引擎,真香!

电子尖叫食人鱼

前端 开发

快速掌握YashanDB的查询优化技巧

数据库砖家

重塑法律服务新生态,AlphaGPT筑牢法律AI数据安全防线

科技汇

治理代币的质押周期应该如何科学设定?

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 代币开发 代币开发公链开发

快速构建高效数据仓库:YashanDB数据库应用指南

数据库砖家

从代码审计到生态共建 解码鼎夏智能的产业跃升密钥

极客天地

炸裂!Dify新版发布:内置MCP双向支持!

王磊

灯塔低代码开发平台与DeepSeek深度融合,共筑AI编程的星辰大海

中烟创新

不同质押周期对代币价格稳定性的具体影响及数据支撑

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

常用YashanDB命令与操作实例

数据库砖家

数智焕新!用友BIP交出央国企价值替代新答卷

用友BIP

快速入门YashanDB数据库自动化运维工具

数据库砖家

如何高效利用YashanDB数据库进行数据挖掘

数据库砖家

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