HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

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

关注

评论

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

坚持新媒体写作第21天了,聊聊我为什么喜欢写作

老胡爱分享

学习 写作 习惯养成 坚持 随笔杂谈 讨论写作

用户密码验证函数

叶鹏

一个草根的日常杂碎(9月21日)

刘新吾

生活 现实纪录 随笔

高难度对话读书笔记—情绪篇

wo是一棵草

简述JVM垃圾回收

叶鹏

两天,我把分布式事务搞完了

yes

分布式事务 seata

实战中学习浏览器工作原理 — 排版与渲染

三钻

CSS 大前端 浏览器

anyRTC云端录制功能上线

anyRTC开发者

WebRTC 语音 直播 RTC 安卓

架构师训练营第四周作业

叶鹏

前端如何优雅处理类数组对象?

Geek_z9ygea

Java 大前端

【性能优化】面试官:Java中的对象都是在堆上分配的吗?

冰河

面试 性能优化 JVM 性能调优 逃逸分析

Spring 5 中文解析数据存储篇-编程式事物管理

青年IT男

Spring5

食堂卡就餐卡系统

叶鹏

被我玩坏的git:除了之前的工作、当网盘用,还能这么玩

小Q

Java git 程序员 架构 开发

架构师训练营第八周作业

叶鹏

简述 CAP 原理

叶鹏

常用设计模式

叶鹏

从零开始搭建完整的电影全栈系统(五)——WEB网站、Api以及爬虫的部署

刘强西

爬虫 网站搭建 部署与维护

关于Java调用类的main方法

谷鱼

Java 包位置

Springboot 定时任务

hepingfly

定时任务 springboot 注解

oeasy 教您玩转linux 010304 图形界面 xfce

o

小白理财先转变思维理念

boshi

理财 收入 财富自由

架构师第1课作业及学习总结

小诗

Python 中 \x00 和空字符串的区别,以及在 Django 中的坑

AlwaysBeta

Python django 编程

Spring 5 中文解析数据存储篇-@Transactional使用

青年IT男

spring

架构师训练营第7周作业

叶鹏

18 张图,一文了解 8 种常见的数据结构

沉默王二

Java 数据结构

微服务的框架(Dubbo)架构

叶鹏

架构师训练营12周作业

叶鹏

一文学懂递归和动态规划!

小齐本齐

算法 数据结构和算法

ECMAScript 6新特性简介

程序那些事

nodejs ES6 ECMAScript 6

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