AI实践哪家强?来 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:001135
用户头像

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

关注

评论

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

架构重构之禅

ninetyhe

Java 架构设计 代码重构

为什么中国出了这么多厉害的互联网公司,但没有自己设计过编程语言?

代码制造者

编程语言 低代码 企业信息化 零代码 编程开发

浅谈业务系统设计哲学

滴滴普惠出行

永续合约交易系统开发方案,合约交易所源码搭建

13530558032

第 0 期架构师训练营第 4 周作业 1

fujin

温故知新——Spring AOP

牛初九

spring aop ioc

奈学:Executor线程池的概述

古月木易

线程池 Executor

有了MDL锁视图,业务死锁从此一目了然

华为云开发者联盟

MySQL 数据库 华为云 MDL锁视图 元数据

Docker 镜像构建之 docker commit

哈喽沃德先生

Docker 容器 微服务

一周信创舆情观察(8.10~8.23)

统小信uos

技术揭秘:华为云DLI背后的核心计算引擎

华为云开发者联盟

大数据 spark 数据湖 华为云 DLI

区块链钱包应用开发,数字货币钱包源码

13530558032

区块链承兑支付系统开发,USDT入金支付系统

13530558032

前端训练营(15)-动画

罗思雨

大前端

netdata安装到redhat7.6最简手册

橙子冰

netdata

第 0 期架构师训练营第3周作业1

fujin

组合模式

JAVA,.NET项目开发难上手?Learun敏捷开发框架解君愁

Learun

第 0 期架构师训练营第 4周作业 2--- 总结

fujin

爱技术爱折腾,想要编程到60岁--我的十年

盛安德软件

XSKY星辰天合助力中国五矿打造政企办公新标杆

XSKY星辰天合

90%的开发都没搞懂的CI和CD!

禅道项目管理

ci DevOps 持续集成 持续交付 持续部署

CUDA,cuDNN,pytorch 在win10环境下的下载安装

Qx

教程 PyTorch

数据隔离、访问授权,用好大数据为什么这么难?

华为云开发者联盟

大数据 数据湖 华为云 DLI 数据隔离

第 0 期架构师训练营第 3 周作业2---总结

fujin

合约跟单交易系统开发,交易所一键跟单模式搭建

13530558032

易观方舟Argo+CRM | 让企业数据发挥更大价值

易观大数据

实用!教学白板跨国低时延互动技术实现指南

ZEGO即构

OSS 全站加速 集群

Docker 之常见应用部署

哈喽沃德先生

Docker 容器 微服务

如何在3秒内打开一个网址

BabyKing

LeetCode题解:20. 有效的括号,栈,JavaScript,详细注释

Lee Chen

大前端 LeetCode

白板技术实践:在线教育平台如何保障课件数据安全

ZEGO即构

加密解密 OSS 鉴权

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