ruby和python比较_为什么说Ruby比Python容易阅读

本文对比了Python和Ruby两种语言在字符串格式化、映射操作和DSL(领域特定语言)方面的差异,探讨了它们如何影响代码的可读性和程序员的体验。Python强调规范化,如强制缩进,适合注重逻辑和规范的开发者;而Ruby注重人性化和可读性,其DSL特性让代码更简洁,适合喜欢直观表达的开发者。
摘要由CSDN通过智能技术生成

这是一篇充满偏见的语言战争文章,是一场无意义的锤子和锤子的比拼。语言的复杂性可以通过选择语言回避,而问题本身的复杂性是选择哪个语言都无法回避的。

不屑语言战争的人可以轻松无视此文。

1、字符串格式化

Python

"%s=%s"%(k, v)

在阅读 Python 字符串格式化的时候,视线先看到字符串的 %s 字样,但是不知道这指的是什么,然后看后面的变量 k,再接着看第二个 %s ,再看后面的 v 视线必须不停地在字符串和变量之间跳动。

Ruby

"#{k}=#{v}"

而阅读 Ruby 字符串格式化的时候,看到需要变量的地方,变量就在那里。

顺便一说

"%s = %s"%[k,v]

这种风格的代码在 Ruby 里面也能用,Ruby 的理念认为解决问题的方法可以不止一种,选择哪种取决于程序员的喜好。

2、映射(迭代)

这在 Python 中叫做列表解析,不过不管叫什么,实际上这是迭代的一种。

[elem*2foreleminli]

li 是一个 list。阅读这行代码的时候,先看到 elem*2,但是不知道 elem 是什么。继续看,再次看到 elem ,还是不知道是什么。一直看到 in li,奥,原来 elem 是 li 中的元素,对了,刚才对 elem 做了什么来着?

如果一个元素的解析还不太迷惑,继续看下面这个例子。

["%s=%s"%(k, v)fork, vinparams.items()]

请问我应该先看哪个部分。

下面是 Ruby 版。

li.map {|elem|elem*2}

params.map {|k, v|"#{k}=#{v}"}

求 params 的映射(map),其中的元素是原本params里面 k, v 键值对组成的字符串,我不确保没有 Ruby 基础的人会不会习惯这种 block 语法,但是我可以保证阅读代码的时候是从左到右的单一顺序。

3、DSL(领域语言)

为了举一个现实中有代表意义、但是又足够简单的例子,我找到了 webpy 和 sinatra,这分别是 Python 和 Ruby 社区热门的简洁风格 web 框架。

前置的说明是,webpy,甚至是 Python,都不是一个追求 DSL 的社区。而 Ruby 社区则以 DSL 见长,这样比较似乎有失公允。但这里可以比较 DSL 的有无对于代码的可读性有什么帮助。

webpy 的 hello world

importweb

urls=('/','hello')

app=web.application(urls, globals())classhello:defGET(self):return'Hello, world!'if__name__=="__main__":

app.run()

我对 webpy 原本的 helloworld 做了简化,以便和 sinatra 比较。

坦率地说,webpy 的 hello world 已经够简洁了。相比起 Java EE 和 .net 庞大的 IDE 和那根本不知道拿来做什么的规范,webpy 让我们回归了单纯,简约而不简单。

但是,简约方面,Ruby 的 DSL 文化更是做到了极致,看 sinatra 的例子

require'sinatra'get'/'do"Hello World!"end

sinatra 的 DSL 非常简练,甚至让人怀疑它是否是一个玩具。或者可以看下 sinatra 的文档或者用户列表,现在请先暂且相信,它做的事跟 webpy 没什么两样。

DSL 是语言层面的封装,把复杂性留在库的内部,把接口用 DSL 的形式暴露给程序员。这其实跟类和函数方式的 API 没有什么不同。不过 DSL 会让人忘记自己正在使用什么语言,Rubyists 的说法是:魔法。

总结

Python 和 Ruby 虽然同为动态语言时代的佼佼者,不过开发和社区风格有很大的不同。这归根于两个语言诞生时的理念不同:Python 注重规范化,一个问题只有一个方法,缩进的强制约束,便于多人合作;而 Ruby 注重人性化,便于阅读,一个问题有几个方法,过多的魔法需要使用者自己锻炼驾驭能力。

这样的结果就是偏重数学,偏重模范化的人喜欢 Python;偏重乐趣,偏重人类语言化的人喜欢 Ruby。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值