写点什么

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

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

关注

评论

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

带你认识7种云化测试武器

华为云开发者联盟

测试 接口测试 华为云DevCloud 云化测试 Mock 服务

Hive on Spark和Spark sql on Hive,你能分的清楚么

华为云开发者联盟

sql 分布式计算 Sparksql hive on spark 数据源

Flink类型系统的根及相关接口

编程江湖

flink

一文整理区块链技术为企业带来的九大好处

CECBC

SphereEx 完成近千万美元 Pre-A 轮融资,加速构建新一代数据库生态引擎

SphereEx

开源 融资 ShardingSphere SphereEx 嘉御资本

Kafka原理——Kafka为何如此之快?

Kafka中文社区

今天你的静态变量和静态代码块执行了吗?

华为云开发者联盟

Java 类加载 静态 静态变量 静态代码块

前端开发Vue中的v-指令的使用

@零度

Vue 前端开发

10个问题让你快速避开java中的jdbc常见坑

华为云开发者联盟

Java 数据库 JDBC fetchSize Prepared Statement

一文了解区块链如何帮助打击虚假信息

CECBC

spring源码搭建

派大星

Spring5源码解析

架构营模块八作业

GTiger

架构实战营

「自我检验」熬夜总结50个Vue知识点,全都会你就是神!!!

Sunshine_Lin

面试 Vue 前端 进阶 ES6

作业5

施正威

ReactNative进阶(一):ReactNative 学习资料汇总

No Silver Bullet

React Native 1月月更

面试官:为什么不同返回类型不算方法重载?

王磊

【Golang】浅谈协程并发竞争资源问题

恒生LIGHT云社区

golang 后端 协程 并发 Go 语言

【量化】量化交易入门系列3:经典的量化交易策略(中)

恒生LIGHT云社区

量化投资 量化交易 量化

EMQ 映云科技入围 Venture50 行业榜单,数字科技企业风向标!

EMQ映云科技

物联网 Venture50

nodejs 异步I/O和事件驱动

编程江湖

nodejs

netty系列之:选byte还是选message?这是一个问题

程序那些事

Java Netty 程序那些事 UDT 1月月更

什么是Log4Shell?Log4j漏洞解读

龙智—DevSecOps解决方案

log4j Log4j 2 Log4Shell

潘娟:Keep open,Stay tuned 开源为我打开的全新世界 | TiDB Hackathon 2021 评委访谈

PingCAP

作业4

施正威

测试阻碍交付,如何破解这一难题?

飞算JavaAI开发助手

书单 | 学习数据可视化?看这些书就够了!

博文视点Broadview

科技驱动经济发展的时代全面到来

CECBC

编写Spring MVC控制器的技巧

编程江湖

Spring MVC

Java开发之测试框架知识分享

@零度

Java

大数据开发之Hive SQL的优化分享

@零度

大数据 Hive SQL

网络安全好学吗?基础入门篇,NMAP高级使用技巧和漏洞扫描发现

学神来啦

网络安全 渗透测试 kali基础 nmap kali Linux

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