写点什么

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

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

关注

评论

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

第58期 | GPTSecurity周报

云起无垠

AIGC GPT

【论文速读】| JADE:用于大语言模型的基于语言学的安全评估平台

云起无垠

WebSocket vs. SSE:哪种实时通信技术更适合你?

Apifox

前端 后端 websocket 实时通信 sse

华为云Astro低代码平台开启AI敏捷组装时代,探索低代码创新无限可能

轶天下事

会员信息一键同步!微盟与客如云联手打造智能服务新体验!

聚道云软件连接器

案例分享

什么?这动物图片可以上国家地理?

程序那些事

程序那些事 Stable Diffusion

华为如何助力金融大模型开出价值之花

脑极体

AI

性能测试:性能测试流程与方法

测吧(北京)科技有限公司

测试

新加坡工作和生活指北:教育篇

Keegan小钢

教育

五问五答|看忆联eMMC如何赋能智能电视长效稳定

新消费日报

什么是MES系统?有什么作用?

万界星空科技

制造业 生产管理系统 mes 万界星空科技

【好消息】祝贺傲冠行云服务获得深圳知名品牌称号!

行云管家

IT 知名品牌 傲冠行云服务

软件测试学习笔记丨Allure2报告中添加用例分类

测试人

软件测试

硬核案例分享,一文带你拆解PHP语言体系下的容器化改造

华为云开发者联盟

云原生 华为云 应用现代化 华为云开发者联盟 企业号2024年7月PK榜

探索动力极限 康士柏马力机重塑速度与激情的边界

极客天地

软件测试学习笔记丨Allure2报告中添加用例步骤

测试人

软件测试 测试开发

Solana近况及解读:Sol链代币DApp开发详解

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

数字身份管理发展趋势:使用区块链技术进行身份管理

芯盾时代

区块链 数字身份 身份安全 统一身份认证

亚信科技入选信通院“数据智能产业图谱”, 打通数据智能服务全链路!

亚信AntDB数据库

AntDB数据库

运营海外社媒效率低?试试云手机!

Ogcloud

云手机 海外云手机 云手机海外版 社媒运营 海外社媒运营

告别手工录入,企业财务凭证同步迈入智能新时代!

聚道云软件连接器

案例分享

智源打造基于Triton的大模型算子库,助力AI芯片软硬件生态建设

智源研究院

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