阿里、蚂蚁、晟腾、中科加禾精彩分享 AI 基础设施洞见,现购票可享受 9 折优惠 |AICon 了解详情
写点什么

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

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

关注

评论

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

用热爱,走一些“远”路!

禅道项目管理

24款数据可视化工具介绍

2D3D前端可视化开发

数据分析 web前端 数据可视化工具 可视化看板 数据可视化软件

【我和openGauss的故事】 openGauss 5.0.0 分区表增强

daydayup

opengauss

博睿数据获聘信通院DGA首批智库专家组

博睿数据

可观测性 智能运维 博睿数据 信通院 专家智库

实现在线直播源码高质量直播体验重要功能_山东布谷科技创作

山东布谷科技

软件开发 直播 源码搭建 直播源码 在线直播源码

点云标注在自动驾驶中的重要性

来自四九城儿

为什么要做稳定性保障?

老张

SRE 稳定性保障

12 点半!Voxel51 亚太地区计算机视觉线上 Meetup,速来!

Zilliz

计算机视觉 Milvus Zilliz voxel51

AIGC第一波裁员已至

互联网工科生

人工智能 裁员 AIGC

敏捷领导力 (CAL E+O / ALJ) 认证

ShineScrum捷行

Jedis 参数异常引发服务雪崩案例分析

vivo互联网技术

服务雪崩 Redis集群模式 主从切换 Jedis参数设置

浅析本地缓存技术-Guava Cache | 京东物流技术团队

京东科技开发者

Java 缓存 Guava Cache Guava 企业号 7 月 PK 榜

百度知道上云与架构演进

百度Geek说

云原生 架构演进 业务上云 企业号 7 月 PK 榜

深耕行业创新 引领视听未来 | 宇视亮相北京Infocomm China 2023展会

新消费日报

【我和openGauss的故事】openGauss逻辑备份恢复

daydayup

openGauss数据库源码解析系列文章——AI技术(二)

daydayup

opengauss

订单逆向履约系统的建模与PaaS化落地实践 | 京东云技术团队

京东科技开发者

领域建模 企业号 7 月 PK 榜 订单逆向履约 快退

百亿规模京东实时浏览记录系统的设计与实现 | 京东云技术团队

京东科技开发者

数据 离线 企业号 7 月 PK 榜 浏览记录

什么是大规模敏捷SAFe?SAFe大规模敏捷管理工具

顿顿顿

敏捷开发 safe 大规模敏捷 scrum工具

云原生机甲的构想

如水

云原生 servicemesh 云原生机甲 CloudMecha

【我和openGauss的故事】记一次基于在银河麒麟系统上适配openGauss进阶之旅

daydayup

【我与openGauss的故事】openGauss 5.0企业版主从部署,实战狂飙

daydayup

opengauss

openGauss DBMind上的多指标关联性分析介绍

daydayup

opengauss

对线面试官-Redis 十一 | 双写一致性问题

派大星

Java 面试题

【我和openGauss的故事】openGauss特性:CM支持两节点部署特性

daydayup

揭秘高新技术发展最新趋势,程序猿视角下的技术革新感悟 | 社区征文

三掌柜

年中技术盘点

openGauss资源池化开发者入门指南

daydayup

opengauss

思考:数字卫星可视化如何实现?

DevOps和数字孪生

仿真建模 数字卫星

掌数科技携手华为云GaussDB,助力金融科技创新,联合打造行业标杆

华为云开发者联盟

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

点云标注在自动驾驶中的挑战

来自四九城儿

MobPush 推送限制策略

MobTech袤博科技

程序员 前端 push 智能推送 推送

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