写点什么

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

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

关注

评论

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

Python数据处理之导入导出excel数据

AntDream

Python 人工智能 大数据 数据分析 数据处理

Android面试题之Kotlin协程一文搞定

AntDream

面试 kotlin 协程 协程原理 android jetpack

万界星空科技MES打造数字化生产车间

万界星空科技

数字化转型 数字化 mes 万界星空科技 数字化车间

通过技术优化财务规划报告,重塑企业体验

智达方通

企业管理 全面预算管理 财务规划 财务报告 财务办公

Android面试题之Kotlin协程到底是什么?它是线程吗?

AntDream

面试 kotlin 协程 协程原理 android jetpack

淘宝官方商品、交易、订单、物流接口列表(淘宝oAuth2.0接口),API稳定、QPS高的方案

tbapi

淘宝店铺订单接口 淘宝店铺订单交易接口 淘宝店铺订单详情接口 淘宝店铺订单物流接口

神州数码与 EMQ 达成合作,共创 AI 时代的行业数据解决方案

新消费日报

mac菜单栏应用管理软件:Bartender 4 for Mac v4.2.25中文免激活版

你的猪会飞吗

Mac软件下载站 mcc软件

爆赞!GitHub首本前端开发实战Vue.js3,标星果然百万名不虚传

Geek_12490f

编程 程序员 前端 #Github VUE 3.0 源码解析

从Purge机制说起,详解GaussDB(for MySQL)的优化策略

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号2024年6月PK榜

漆包线行业你了解多少?专业漆包线工厂智能化生产管理系统

万界星空科技

mes 万界星空科技 漆包线mes 漆包线 漆包线工厂

Git是如何保存和记录数据的——数据对象

AntDream

Git Submodule git merge git 规范 git hook

mac苹果电脑游戏推荐:fm足球经理Football Manager 2023 中文版

你的猪会飞吗

Mac游戏下载 Mac游戏推荐

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