写点什么

Ruby 编程:清晰明确的代码还是简洁精炼的代码?

  • 2007-07-30
  • 本文字数:966 字

    阅读完需:约 3 分钟

Pier Cawley 撰文探讨了他在一篇介绍延迟初始化属性的博客文章中发现的潜在问题。出现问题的代码如下:

def content<br></br> @content ||= []<br></br>end这段代码的目的是为了支持类的延迟初始化属性。在这个例子当中,除非@content这个实例变量已经初始化完毕,否则在它的访问器方法content方法被调用的时候,它就会被初始化。||=这个操作符意思是“如果左边的变量值为nil,将它的值赋为右边表达式,否则仅返回左边的变量值。”

然而,Piers 指出,对于某些值来说,这样做是会出现问题的,因为 Ruby 处理布尔值和nil的方式比较特殊。我们来看看下面这样一个例子:

a = false<br></br>a ||= "Ruby"这样的代码结果是怎样的呢?由于a已经在第一行被初始化,第二行不应产生任何效果。然而,在代码执行之后,我们会发现a现在的值为"Ruby",而不是false

在熟记 Ruby 中编写nil检查通用方式之后,问题就变得非常显而易见:

if name<br></br> puts name.capitalize<br></br>end在 Ruby 中,nil被解释成布尔值false,因此if子句中的代码只有在name的值不等于nil的时候才能运行。

尽管在通常意义上这不会成为一个问题,但是在延迟初始化属性的代码中,如果付给属性的合法值是nil或者false的时候,这就会成为一个问题。在这种情况下,对属性进行访问之后,属性值就会被重设成缺省值。

当然,这是一个边界情况,但是这样的问题会导致人们花很长时间进行调试,来试图找出到底为什么某些方法有些时候会被重设而另外一些则不会。

Piers为这段代码给出了一个条理更为清晰的代码

def content<br></br> unless instance_variable_defined? :@content<br></br> @content = []<br></br> end<br></br> return @content<br></br>end这样,代码只会在变量还没有被定义的时候才会初始化变量。

通过这个小例子,我们可以把错误归咎于 Ruby 及其部分语言特性——但 _ 哪一类 _ 程序员会把错误归咎于工具而不是他们自身,这已经是众所周知的事实了。尽管 Ruby 代码的简洁性非常有用,但还是有一些情况下使用更加明确表达意图的表达式会更安全一些。在这个例子中,||=并非正确的解决方案,相反初始化代码应当检查变量是否已经被定义。

亲爱的读者,您在以前是否也被这样的问题敲中脑门呢?Ruby 是否存在哪些你希望避免的语言特性,以预防上述难于发现的问题呢?

查看英文原文: Explicit vs. concise code in Ruby

2007-07-30 09:00873
用户头像

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

关注

评论

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

架构训练营 week7 课程总结

红莲疾风

「架构实战营」

Flink Keyed State 对 Key 的管理机制解析

邸星星

flink 状态管理 Flink KeyedState

[架构实战营]第六模块作业

Vincent

「架构实战营」

设计模式之工厂模式

Catch

设计模式

Luna:你想要的 React Native 调试工具

Shopee技术团队

前端 开发者工具 React Native

实现科技自立自强,各企业如何发力?

脑极体

架构训练营 week7 作业

红莲疾风

「架构实战营」

详解 Flink CEP(以直播平台监控用户弹幕为例)

五分钟学大数据

flink 1月月更

研发转岗产品经理,有什么需要注意的呢?

石云升

产品经理 产品思维 1月月更

设计模式之设计原则

Catch

设计模式

设计模式之单例模式

Catch

设计模式

Spark 核心详解

五分钟学大数据

spark 1月月更

18M 超轻量图像识别系统,商品、车辆、人脸识别一网打尽!

百度大脑

架构实战营 - 群讨论汇总 (2022)

华仔

#架构实战营

参加开源贡献后,大厂向我抛出了橄榄枝

openLooKeng

回顾明道云的2021(文末互动有奖)

明道云

知名身份安全厂商九州云腾加入龙蜥社区

OpenAnolis小助手

Linux 开源 互联网

看看 InfoQ 的编辑和各大厂技术专家们,如何盘点技术圈的 2021

InfoQ写作社区官方

2021年度技术盘点与展望

开发postgreSQL connector支持update/delete操作的代码

openLooKeng

手把手教你在优麒麟上搭建 RISC-V 交叉编译环境

优麒麟

Linux 开源 开发者 risc-v 优麒麟

分布式项目中,选型与依赖管理

架构 分布式 微服务 架构设计

“中国智能科学技术最高奖”公布,华为云田奇获杰出贡献奖

Geek_2d6073

对比下 datax 的 OceanBase/MYSQL 不同数据同步方案的效率差异 || 聊聊参数 rewriteBatchedStatements

明哥的IT随笔

数据库

夜莺系统调研报告

苍狼

AI贺新年,开发者的虎年这样过才有意思

华为云开发者联盟

AI 华为云

TDSQL | DTS for PostgreSQL 逻辑复制详解

腾讯云数据库

tdsql 国产数据库

TDSQL | 《checkpoint原理浅析》

腾讯云数据库

tdsql 国产数据库

创梦天地发行公益性数字艺术藏品,打造不一样的年味

科技热闻

TDSQL | TXSQL数据库内核与特性

腾讯云数据库

tdsql 国产数据库

在 Kubernetes 上安装和运行极狐GitLab实例

极狐GitLab

Kubernetes 极狐GitLab

Hive SQL底层执行过程 | 社区征文

五分钟学大数据

hive 新春征文

Ruby编程:清晰明确的代码还是简洁精炼的代码?_Ruby_Werner Schuster_InfoQ精选文章