QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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

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

关注

评论

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

墨天轮《2022年中国数据库行业年度分析报告》正式发布,精彩抢先看

墨天轮

数据库 Serverless 云原生 国产数据库 HTAP

【计算讲谈社】第十六讲|当我们在谈目标时,究竟在谈什么?

大咖说

开源!MatrixBench:实时物联网场景的数据压测“兵法秘籍”

YMatrix 超融合数据库

开源 物联网 超融合数据库 YMatrix MatrixBench

TiDB Operator--K8S集群基础环境配置

TiDB 社区干货传送门

实践案例 集群管理 管理与运维 安装 & 部署 扩/缩容

2023年知名堡垒机厂商及价格简单说明

行云管家

网络安全 信息安全 数据安全 堡垒机

工厂年后开工:停机设备的维护和准备工作

PreMaint

设备健康管理 设备管理 设备预测性维护

DR Auto-Sync 的 ACID 恢复功能简介和长期断网应急处理方案

TiDB 社区干货传送门

管理与运维 数据库架构设计

【ha知识两问】ha软件是什么?ha软件用途有哪些?

行云管家

高可用 ha 日志审计 双机热备

品牌不得不投放户外LED广告的原因

Dylan

LED显示屏 户外LED显示屏 led显示屏厂家

Cloud + TiDB 技术解读

TiDB 社区干货传送门

云小课|GaussDB如何进行性能调优

华为云开发者联盟

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

软件测试/测试开发 | app自动化测试(Android)—参数化用例

测试人

软件测试 自动化测试 测试开发 appium app自动化测试

PingCAP 黄东旭万字长文剖析数据库发展新趋势:脱离应用开发者的数据库,不会成功

TiDB 社区干货传送门

数据库前沿趋势

通过Jmeter批量向TiDB数据库插入数据

TiDB 社区干货传送门

性能调优 实践案例 管理与运维 安装 & 部署 数据库连接

TiDB 的数据加载性能调优方案

TiDB 社区干货传送门

性能调优 应用适配

webhook告警配置

TiDB 社区干货传送门

机房搬迁更改集群IP

TiDB 社区干货传送门

ChatGPT3.5 !微软最新官宣整合OpenAI的14个产品细节,改变从视频会议Teams开始

B Impact

2023云原生安全值得关注的3个方向

HummerCloud

ebpf 云原生安全 SBOM

程序员必备的数据库知识:数据存储结构

NineData

数据结构 数据集 数据存储 分布式链路 Radix Tree

Grafana组件升级和离线镜像源

TiDB 社区干货传送门

监控 版本升级

Apipost预执行脚本使用教程

徐天

软件测试/测试开发 | app自动化测试(Android)—Capability 使用进阶

测试人

软件测试 自动化测试 测试开发 appium app自动化测试

构建工具tsup入门第一部分

小鑫同学

前端 编译 工具链

基于ModelArts进行流感患者密接排查

华为云开发者联盟

人工智能 华为云 行人检测 企业号 2 月 PK 榜 华为云开发者联盟

看板:自我管理的高效工具!

敏捷开发

项目管理 软件开发 看板

【Nacos配置管理】一文带你搞懂Nacos配置管理模块

石臻臻的杂货铺

nacos

通过Jmeter对TiDB数据库进行压测

TiDB 社区干货传送门

监控 性能调优 实践案例 故障排查/诊断 安装 & 部署

DR Auto-Sync 搭建和灾难恢复手册

TiDB 社区干货传送门

管理与运维 数据库架构设计

Apipost产品介绍

徐天

为啥要对jvm做优化

华为云开发者联盟

开发 华为云 企业号 2 月 PK 榜 华为云开发者联盟

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