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

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

关注

评论

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

20道高频vue面试题自测

bb_xiaxia1998

Vue 前端

浅谈测试需求分析

霍格沃兹测试开发学社

Monkey基本参数介绍

霍格沃兹测试开发学社

云行| 加码算力网络布局,天翼云发布南京3AZ节点

天翼云开发者社区

MySQL锁机制总结

霍格沃兹测试开发学社

AI测试中的数据收集

霍格沃兹测试开发学社

怎样成为优秀的测试工程师

霍格沃兹测试开发学社

帮助 Meta 解决 Presto 中的数据孤岛问题

Alluxio

sql 开源 presto Alluxio meta

Wallys//Industrial_Wireless_AP//network,card//QCN6024/QCN9074/QCN9024,WiFi,Card IPQ6010,802.11ax,2x2

wallys-wifi6

QCN9074 QCN6024 QCN9072

墨天轮沙龙 | 麦杰科技卢学东:openPlant 实时数据库系统及应用

墨天轮

数据库 工业 国产数据库 实时数据库

技术分享 | web自动化测试-PageObject 设计模式

霍格沃兹测试开发学社

天翼云ECK云边一体化

天翼云开发者社区

字节跳动数据血缘图谱升级方案设计与实现

字节跳动数据平台

数据库 数据优化 数据血缘 数据研发

UI自动化截图之chrome&Firefox篇

霍格沃兹测试开发学社

vue进阶面试题

bb_xiaxia1998

Vue 前端

2022年下半年如何备考 CKS

baiyutang

云原生 k8s 云安全 CKS

opencv 使用 GPU 加速

霍格沃兹测试开发学社

凭这份堪称保姆级别的Java面试宝典,已怒斩3个大厂offer(阿里,美团,腾讯)

Geek_0c76c3

Java 数据库 开源 程序员 架构

基于TensorFlow Serving的YOLO模型部署

霍格沃兹测试开发学社

荣耀开发者服务平台全新升级,助力开发者简单开发、高效分发

荣耀开发者服务平台

开发者 手机 安卓 荣耀 honor

《Vue.js技术内幕》有奖书评活动正式开启

图灵社区

vue.js 前端

《Vue.js技术内幕》有奖书评活动正式开启

图灵教育

vue.js 前端

中国信通院沙龙|火山引擎边缘云助力业务体验创新

火山引擎边缘云

云计算 云原生 边缘计算 边缘节点 信通院

我的文件夹(知识库)上线了!|ModelWhale 版本更新

ModelWhale

人工智能 数据挖掘 项目管理 数据分析 代码库

火山引擎CDN的技术演进与未来

火山引擎边缘云

存储资源盘活系统,“盘活”物联网架构难题(下)

天翼云开发者社区

anime4k 在真机租用上的应用尝试

霍格沃兹测试开发学社

Kafka入门

霍格沃兹测试开发学社

数据库连接池

C++后台开发

MySQL 数据库 后端开发 Linux服务器开发 连接池

软件测试 丨 真实面试经历分享,不用再看其他面试题

测试人

软件测试 面试题 自动化测试 测试开发

项目倒排,跟工期不足say byebye

霍格沃兹测试开发学社

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