AICon上海|与字节、阿里、腾讯等企业共同探索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:001020
用户头像

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

关注

评论

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

网络安全警钟:Windows TCP/IP协议出现高危漏洞

郑州埃文科技

TCP IP 漏洞

一次JVM GC长暂停的排查过程

京东科技开发者

Dubbo源码浅析(一)—RPC框架与Dubbo

京东科技开发者

别再被坑了! JavaScript类型检测的最佳实践

沉浸式趣谈

JavaScript 数据结构 数据类型

10分钟构建运维安全审计系统

coxi_vv

开源 运维 1Panel jumpserver

10分钟构建Web 应用防火墙-uuWAF

coxi_vv

开源 waf 1Panel

10分钟构建内网邮件服务器

coxi_vv

开源软件 1Panel 开源邮件服务器 邮件服务器

代理IP为什么很难达到100%的利用率?

IPIDEA全球HTTP

Mobpush 标签推送

MobTech袤博科技

HarmonyOS应用程序访问控制探究

白晓明

HarmonyOS NEXT

本地部署马斯克开源Grok-1大模型,贝锐花生壳3步实现远程访问

贝锐

AI 内网穿透 Stable Diffusion

短信验证合规指南

MobTech袤博科技

开发者

如何在Python中使用免费的DeepL翻译API

幂简集成

Python 翻译 API 免费API

实时监控的力量:观测云如何提升业务响应速度

可观测技术

实时监控

10分钟构建业务数据大屏

coxi_vv

服务器 数据可视化 开源软件 DataEase 1Panel

Go 语言 viper 库上手实践

FunTester

PromQL:观测云中的监控数据分析利器

可观测技术

数据分析

数据驱动决策:观测云在企业战略中的作用

可观测技术

数据结构

用户体验的优化:观测云在用户行为分析中的应用

可观测技术

用户体验

10分钟构建服务监控工具

coxi_vv

监控 Prometheus 1Panel

20分钟构建企业知识库

coxi_vv

开源 halo 1Panel 开源知识库

Poetry vs npm:两个包管理器的迷人相似性

我再BUG界嘎嘎乱杀

Python 编程 后端 npm Poetry

AI+仿真,助力工业智能化变革:面向仿真工程师的机器学习工具

Altair RapidMiner

人工智能 AI 设计 仿真 altair

【后台体验】运营后台订单详情设计分享

京东科技开发者

案例分享 | 八爪鱼RPA在社区医疗流程自动化系统中的应用

八爪鱼采集器︱RPA机器人

RPA 自动化 流程

数据安全与合规性:观测云在保护企业数据中的角色

可观测技术

数据安全

AI 流媒体音乐平台 Melodio 发布;多模态模型 VITA 可打断无需唤醒词丨 RTE 开发者日报

声网

每个Moka招聘系统用户都需要一套八爪鱼RPA

八爪鱼采集器︱RPA机器人

RPA 自动化 招聘 智能化

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