限时领|《AI 百问百答》专栏课+实体书(包邮)! 了解详情
写点什么

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

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

关注

评论

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

在武汉学习web前端开发课程哪家比较好

小谷哥

SAP Fiori 应用 Adapt UI 动态显示或者隐藏的技术设计细节解析

汪子熙

JavaScript 前端开发 web开发 SAP 7月月更

在线多行文本批量正则替换添加后缀工具

入门小站

工具

WorkPlus SE | 全国第1个永久免费的即时通讯软件!

BeeWorks

裴丹:AIOps 智能运维经验分享

华为云开发者联盟

云计算 后端

Optional的使用详解

echoes

2022年智能运维企业50强,博睿数据实力入选

博睿数据

数字化 智能运维 博睿数据 性能监测

开发实践丨昇腾CANN的推理应用开发体验

华为云开发者联盟

Python 人工智能

五分钟拿捏Python字典-Python3入门必备[字典详细操作]

迷彩

Python 字典 7月月更 入门教程

Free自由协议系统Dapp开发(锁仓复利)

薇電13242772558

智能合约 dapp

C 语言入门(五)

逝缘~

7月月更

大模型训练难于上青天?效率超群、易用的“李白”模型库来了

OneFlow

机器学习 gpu 模型训练

SpringBoot的SpringBootApplication注解

技术小生

springboot 7月月更

JavaScript基础之值和引用

7月月更

SaaS应用:实现企业数字化转型的最佳途径

Baklib

ST 端侧人工智能之视觉检测课程

贾献华

7月月更

linux远程复制文件命令小总结

入门小站

在线SQL转JSON工具

入门小站

工具

分布式锁用 Redis 还是 Zookeeper?

C++后台开发

redis zookeeper 分布式 后端开发 C++后台开发

企事业单位建设知识管理的七条建议

Baklib

知识管理 企事业单位

在上海想学web前端课程如何选择

小谷哥

# 重要-即时通讯IM开源项目OpenIM关于版本管理及v2.3.0发布计划

Geek_1ef48b

自动化测试如何实施落地?

老张

软件测试 自动化测试 项目落地

灵雀云加入LF机密计算联盟,推进机密计算在云原生场景的应用

York

灵雀云 云原生 机密计算

【开课预告】7~9月学习课程《基于MASA Framework的EShop实战》

MASA技术团队

学习WEB前端去哪里培训比较好

小谷哥

web前端开发技术前景怎么样好不好

小谷哥

如何深入学习Html5前端技术知识

小谷哥

自定义spring boot starter三部曲之二:实战开发

程序员欣宸

Java springboot 7月月更

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