Ruby 趋于人性化 比 Python 更易阅读?
我们已经看到了许多关于 Ruby 与 Python 的对比,51CTO 之前也曾报道过《Python 与 Ruby 各有千秋》。语言的复杂性可以通过选择语言回避,而问题本身的复杂性是选择哪个 语言都无法回避的。 在某种程度上说,是一场无意义的锤子和锤子的比拼。 1、字符串格式化 Python
1. "%s=%s" % (k, v)
在阅读 Python 字符串格式化的时候,视线先看到字符串的%s 字样,但是不知道这指的 是什么,然后看后面的变量 k,再接着看第二个%s ,再看后面的 v,视线必须不停地在字符 串和变量之间跳动。 Ruby
2. "#{k}=#{v}"
而阅读 Ruby 字符串格式化的时候,看到需要变量的地方,变量就在那里。顺便一说,
3. "%s = %s" % [k,v]
这种风格的代码在 Ruby 里面也能用,Ruby 的理念认为解决问题的方法可以不止一种, 选择哪种取决于程序员的喜好。 2、映射(迭代) 映射(迭代) 这在 Python 中叫做列表解析,不过不管叫什么,实际上这是迭代的一种。
4. [elem*2 for elem in li]
li 是一个 list。阅读这行代码的时候,先看到 elem*2,但是不知道 elem 是什么。继 续看,再次看到 elem ,还是不知道是什么。一直看到 in li,原来 elem 是 li 中的元素, 对了,刚才对 elem 做了什么来着? 如果一个元素的解析还不太迷惑,继续看下面这个例子。
5. ["%s=%s" % (k, v) for k, v in params.items()]
请问我应该先看哪个部分。 下面是 Ruby 版:
6. li.map {|elem| elem*2}params.map {|k, v| "#{k}=#{v}"}
“求 params 的映射(map),其中的元素是原本 params 里面 k, v 键值对组成的字符串 “,我不确保没有 Ruby 基础的人会不会习惯这种 block 语法,但是我可以保证阅读代码的 时候是从左到右的单一顺序。 3、DSL(领域语言) DSL(领域语言) 为了举一个现实中有代表意义、但是又足够简单的例子,我找到了 webpy 和 sinatra, 这分别是 Python 和 Ruby 社区热门的简洁风格 Web 框架。 前置的说明是,webpy,甚至是 Python,都不是一个追求 DSL 的社区。而 Ruby 社区则 以 DSL 见长, 这样比较似乎有失公允。 但这里可以比较 DSL 的有无对于代码的可读性有什么 帮助。 webpy 的 Hello World:
7. import web 8. urls = ( 9. 10. ) 11. app =
web.application(urls, globals()) 12. 13. class hello: 14. 15. def GET(self): return 'Hello, world!' '/', 'hello'
16. if __name__ == "__main__": 17. app.run()
我对 webpy 原本的 helloworld 做了简化,以便和 sinatra 比较。 坦率地说,webpy 的 hello world 已经够简洁了。相比起
Java EE 和.net 庞大的 IDE 和那根本不知道拿来做什么的规范,webpy 让我们回归了单纯,简约而不简单。但是,简约 方面,Ruby 的 DSL 文化更是做到了极致,看 sinatra 的例子:
18. require
'sinatra' 19. get '/' do 20. "Hello World!"
21. end
sinatra 的 DSL 非常简练,甚至让人怀疑它是否是一个玩具。或者可以看下 sinatra 的
文档或者用户
列表,现在请先暂且相信,它做的事跟 webpy 没什么两样。
DSL 是语言层面的封装,把复杂性留在库的内部,把接口用 DSL 的形式暴露给
程序员。 这其实跟类和函数方式的 API 没有什么不同。不过 DSL 会让人忘记自己正在使用什么语言, Rubyists 的说法是:魔法。 总结 Python 和 Ruby 虽然同为动态语言时代的佼佼者,不过开发和社区风格有很大的不同。 这归根于两个语言诞生时的理念不同:Python 注重规范化,一个
问题只有一个方法,缩进 的强制约束,便于多人合作;而 Ruby 注重人性化,便于阅读,一个问题有几个方法,过多 的魔法需要使用者自己锻炼驾驭能力。 这样的结果就是偏重数学,偏重模范化的人喜欢 Python;偏重乐趣,偏重人类语言化 的人喜欢 Ruby。 你喜欢哪样呢?欢迎在留言中与他人分享。