深入探討Ruby與Python語(yǔ)法比較
編程語(yǔ)言種類(lèi)繁多,但是每種語(yǔ)言都有自己的特點(diǎn),又和其他語(yǔ)言有共通性。比如PHP語(yǔ)言就和C語(yǔ)言相似。我們今天介紹的就是Ruby與Python語(yǔ)法比較。#t#
其實(shí)Ruby和Python非常接近,比大多數(shù)別的語(yǔ)言要接近的多,所以喜歡用啥就用啥(大實(shí)話(huà),雖然也是廢話(huà))。語(yǔ)法上的差別雖然有那么一點(diǎn),大部分是syntax sugar,我斗膽稍微列幾個(gè)(python我也忘得差不多了,不對(duì)的大家盡管來(lái)鞭尸吧),但是主要差異還是設(shè)計(jì)思想上的:靈活vs明確. 我不認(rèn)為兩者在生產(chǎn)力上會(huì)有什么差別,如果你熟悉的話(huà)。*注意,僅限語(yǔ)言本身的比較。
Ruby與Python語(yǔ)法比較的列表
1. Ruby的case可以匹配很多東西:范圍/數(shù)組,對(duì)象,正則表達(dá),python沒(méi)有case/switch而使用if/else比較死板點(diǎn)
2. python的縮進(jìn)很漂亮,雖然有時(shí)會(huì)造成些許麻煩。Ruby的end蠻難看的,所以大家都被逼當(dāng)one liner(玩笑)
3. 感覺(jué)上Ruby比python更OO,當(dāng)然這也可能是因?yàn)閜ython不提倡用那些改變對(duì)象內(nèi)部構(gòu)造的‘伎倆’造成的錯(cuò)覺(jué)
4. python有l(wèi)ist comprehension, Ruby沒(méi)有:(
5. python有真正的keyword argument, Ruby用hash模擬,當(dāng)然實(shí)際用起來(lái)沒(méi)什么差別
6. python的self很討厭,Ruby沒(méi)有那種繁瑣的東西
7. reflection,Ruby內(nèi)置了很多方法,比如object.methods,而python把這些信息存在特殊的字典里。差不多
8. Ruby的block功能很強(qiáng),python的lambda只能返回單一值
9. Ruby與Python語(yǔ)法比較下,Ruby的open class已經(jīng)聲明遠(yuǎn)播,可以玩出2.days.ago這樣的花樣,python好像沒(méi)法直接修改內(nèi)置類(lèi)也反對(duì)這么做。
10. python需要用@classmethod修飾聲明類(lèi)方法,Ruby是內(nèi)建
11. Ruby有單子方法,也就對(duì)對(duì)象單獨(dú)定制,python不知道有沒(méi)有類(lèi)似概念
12. Ruby有method_missing機(jī)制,python可以使用__getattr__截獲未定義方法(from qiezi)
13. Ruby使用單繼承+mixin,python使用多重繼承,不過(guò)python也有mixin
14. Ruby有attr_*系列語(yǔ)法helper,省卻自己寫(xiě)一堆setter/getter, python的property方法還是得自己寫(xiě)setter/getter
15. Ruby和python都使用duck typing,不過(guò)python也有一套顯式的interface機(jī)制(從zope3并入內(nèi)核了么?)
16. Ruby的函數(shù)調(diào)用括號(hào)是可省的,稍微少敲幾下鍵盤(pán)。python默認(rèn)沒(méi)括號(hào)也不帶參數(shù)的話(huà)返回函數(shù)本身的一個(gè)引用。
17. 我不清楚python的meta programming能到什么程度,只好等大牛來(lái)說(shuō)說(shuō)了。只是覺(jué)得pythoner不常用那個(gè),也許覺(jué)得會(huì)把程序邏輯搞得晦澀不明。
18. Ruby從perl繼承了一部分難看的東西,比如很多預(yù)定義的$x常量
19. Ruby內(nèi)建正則表達(dá),方便一點(diǎn)
20. Ruby的yield是用來(lái)call block的。而python的yield是用來(lái)給generator輸入輸出值的。
21. python的庫(kù)給我感覺(jué)命名規(guī)范有點(diǎn)不統(tǒng)一,有些方法用snake_case有些則用CamelCase,也許是庫(kù)太多了遺留下的歷史問(wèn)題
22. python的三引號(hào)很漂亮,Ruby的<<-XX...XX太難看了,也可以用%q{...}包裹多行文字(from qiezi)
23. Ruby的類(lèi)庫(kù)設(shè)計(jì)中喜歡給方法添加別名,方便記憶。
另: Ruby官方網(wǎng)站也提供了一些基本的Ruby與Python語(yǔ)法比較。