AICon 北京站 Keynote 亮点揭秘,想了解 Agent 智能体来就对了! 了解详情
写点什么

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

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

关注

评论

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

Redis介绍与使用指南

霍格沃兹测试开发学社

灰度发布难以追踪?你可能用错了工具

观测云

可观测性

Linux常用统计命令大全

霍格沃兹测试开发学社

革命性创新:聚道云软件连接器如何为企业重塑财务管理流程?

聚道云软件连接器

案例分享

Linux查看文件内容常用命令

霍格沃兹测试开发学社

AI时代的API新经济:程序员如何利用API轻松实现月收数万?

幂简集成

API 接口 API 策略 API创新

COB封装小间距LED可在哪些领域发挥潜能?

Dylan

技术 cobra LED LED display LED显示屏

一“云”在手,监控无忧——为何一个观测云即可满足全方位监控需求

可观测技术

可观测性

掌握 Postman:请求头使用指南

Liam

Java 程序员 后端 Postman API

Graph+LLM 更进一步|悦数图数据库推出 AI 知识图谱构建器及图语言生成助手

最新动态

甲骨文云中的区间管理:从基础到策略

极客天地

走进甲骨文云服务器:打造专属的云资源管理空间

极客天地

低代码与AIGC实战:引领软件开发的新风潮

不在线第一只蜗牛

低代码 AIGC

从ESB总线到iPaaS集成平台,如何选择最佳集成方案

RestCloud

ESB 系统集成 ipaas

探索TikTok云手机在社交媒体营销的作用

Ogcloud

TikTok 云手机 海外云手机 tiktok云手机 tiktok运营

IT驻场外包能提供哪些类型的服务?

Ogcloud

IT IT外包 IT外包公司 IT外包服务 IT驻场外包

面试官:微服务通讯方式有哪些?

王磊

Java 面试

《实现领域驱动设计》-聚合

不在线第一只蜗牛

DDD

【FAQ】推送获取push token报错6003,如何排查?

HarmonyOS SDK

HarmonyOS

“仍有 5 亿人坚持用 QQ”;马斯克:本周开源 xAI 人工智能助手丨 RTE 开发者日报 Vol.162

声网

程序员必备开发工具(IDE)推荐

霍格沃兹测试开发学社

如何在 Windows 系统电脑中安装 CentOS 7 虚拟机

霍格沃兹测试开发学社

深入理解 Nginx:原理和基础介绍

霍格沃兹测试开发学社

今天来聊聊Hybird app技术

FinFish

小程序容器 跨端框架 Hybird App Hybird开发

Vue常用指令-条件渲染(v-if)

霍格沃兹测试开发学社

全新体验:借助海外云手机畅玩TikTok

Ogcloud

云手机 海外云手机 tiktok云手机 电商云手机 跨境云手机

图像处理-Java-以图搜图

alexgaoyh

Java lucene OpenCV 以图搜图 KNN算法

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