Ruby趨于人性化 比Python更易閱讀?
我們已經(jīng)看到了許多關(guān)于Ruby與Python的對比,51CTO之前也曾報(bào)道過《Python與Ruby各有千秋》。語言的復(fù)雜性可以通過選擇語言回避,而問題本身的復(fù)雜性是選擇哪個(gè)語言都無法回避的。
在某種程度上說,是一場無意義的錘子和錘子的比拼。
1、字符串格式化
Python
- "%s=%s" % (k, v)
在閱讀Python字符串格式化的時(shí)候,視線先看到字符串的%s字樣,但是不知道這指的是什么,然后看后面的變量k,再接著看第二個(gè)%s ,再看后面的v,視線必須不停地在字符串和變量之間跳動(dòng)。
Ruby
- "#{k}=#{v}"
而閱讀Ruby字符串格式化的時(shí)候,看到需要變量的地方,變量就在那里。順便一說,
- "%s = %s" % [k,v]
這種風(fēng)格的代碼在Ruby里面也能用,Ruby的理念認(rèn)為解決問題的方法可以不止一種,選擇哪種取決于程序員的喜好。
2、映射(迭代)
這在Python中叫做列表解析,不過不管叫什么,實(shí)際上這是迭代的一種。
- [elem*2 for elem in li]
li是一個(gè)list。閱讀這行代碼的時(shí)候,先看到elem*2,但是不知道elem是什么。繼續(xù)看,再次看到elem ,還是不知道是什么。一直看到in li,原來elem是li中的元素,對了,剛才對elem做了什么來著?
如果一個(gè)元素的解析還不太迷惑,繼續(xù)看下面這個(gè)例子。
- ["%s=%s" % (k, v) for k, v in params.items()]
請問我應(yīng)該先看哪個(gè)部分。
下面是Ruby版:
- li.map {|elem| elem*2}params.map {|k, v| "#{k}=#{v}"}
“求params的映射(map),其中的元素是原本params里面k, v鍵值對組成的字符串“,我不確保沒有Ruby基礎(chǔ)的人會(huì)不會(huì)習(xí)慣這種block語法,但是我可以保證閱讀代碼的時(shí)候是從左到右的單一順序。
3、DSL(領(lǐng)域語言)
為了舉一個(gè)現(xiàn)實(shí)中有代表意義、但是又足夠簡單的例子,我找到了webpy和sinatra,這分別是Python和Ruby社區(qū)熱門的簡潔風(fēng)格Web框架。
前置的說明是,webpy,甚至是Python,都不是一個(gè)追求DSL的社區(qū)。而Ruby社區(qū)則以DSL見長,這樣比較似乎有失公允。但這里可以比較DSL的有無對于代碼的可讀性有什么幫助。
webpy的Hello World:
- import web
- urls = (
- '/', 'hello'
- )
- app = web.application(urls, globals())
- class hello:
- def GET(self):
- return 'Hello, world!'
- if __name__ == "__main__":
- app.run()
我對webpy原本的helloworld做了簡化,以便和sinatra比較。
坦率地說,webpy的hello world已經(jīng)夠簡潔了。相比起Java EE和.net龐大的IDE和那根本不知道拿來做什么的規(guī)范,webpy讓我們回歸了單純,簡約而不簡單。但是,簡約方面,Ruby的DSL文化更是做到了極致,看sinatra的例子:
- require 'sinatra'
- get '/' do
- "Hello World!"
- end
sinatra的DSL非常簡練,甚至讓人懷疑它是否是一個(gè)玩具。或者可以看下sinatra的文檔或者用戶列表,現(xiàn)在請先暫且相信,它做的事跟webpy沒什么兩樣。
DSL是語言層面的封裝,把復(fù)雜性留在庫的內(nèi)部,把接口用DSL的形式暴露給程序員。這其實(shí)跟類和函數(shù)方式的API沒有什么不同。不過DSL會(huì)讓人忘記自己正在使用什么語言,Rubyists的說法是:魔法。
總結(jié)
Python和Ruby雖然同為動(dòng)態(tài)語言時(shí)代的佼佼者,不過開發(fā)和社區(qū)風(fēng)格有很大的不同。這歸根于兩個(gè)語言誕生時(shí)的理念不同:Python注重規(guī)范化,一個(gè)問題只有一個(gè)方法,縮進(jìn)的強(qiáng)制約束,便于多人合作;而Ruby注重人性化,便于閱讀,一個(gè)問題有幾個(gè)方法,過多的魔法需要使用者自己鍛煉駕馭能力。
這樣的結(jié)果就是偏重?cái)?shù)學(xué),偏重模范化的人喜歡Python;偏重樂趣,偏重人類語言化的人喜歡Ruby。
你喜歡哪樣呢?歡迎在留言中與他人分享。
原文鏈接:http://chloerei.com/2011/01/10/714
【編輯推薦】