锁定老帖子 主题:Ruby和Python的语法差别
该帖已经被评为精华帖
|
|
---|---|
作者 | 正文 |
发表时间:2006-09-25
其实python和ruby非常接近,比大多数别的语言要接近的多,所以喜欢用啥就用啥(大实话,虽然也是废话)。语法上的差别虽然有那么一点,大部分是syntax sugar,我斗胆稍微列几个(python我也忘得差不多了,不对的大家尽管来鞭尸吧),但是主要差异还是设计思想上的:灵活vs明确. 我不认为两者在生产力上会有什么差别,如果你熟悉的话。*注意,仅限语言本身的比较。 1. ruby的case可以匹配很多东西:范围/数组,对象,正则表达,python没有case/switch而使用if/else比较死板点 2. python的缩进很漂亮,虽然有时会造成些许麻烦。ruby的end蛮难看的,所以大家都被逼当one liner(玩笑) 3. 感觉上ruby比python更OO,当然这也可能是因为python不提倡用那些改变对象内部构造的‘伎俩’造成的错觉 4. python有list comprehension, ruby没有:( 5. python有真正的keyword argument, ruby用hash模拟,当然实际用起来没什么差别 6. python的self很讨厌,ruby没有那种繁琐的东西 7. reflection,ruby内置了很多方法,比如object.methods,而python把这些信息存在特殊的字典里。差不多 8. ruby的block功能很强,python的lambda只能返回单一值 9. ruby的open class已经声明远播,可以玩出2.days.ago这样的花样,python好像没法直接修改内置类也反对这么做。 10. python需要用@classmethod修饰声明类方法,ruby是内建 11. ruby有单子方法,也就对对象单独定制,python不知道有没有类似概念 12. ruby有method_missing机制,python可以使用__getattr__截获未定义方法(from qiezi) 13. ruby使用单继承+mixin,python使用多重继承,不过python也有mixin 14. ruby有attr_*系列语法helper,省却自己写一堆setter/getter, python的property方法还是得自己写setter/getter 15. ruby和python都使用duck typing,不过python也有一套显式的interface机制(从zope3并入内核了么?) 16. ruby的函数调用括号是可省的,稍微少敲几下键盘。python默认没括号也不带参数的话返回函数本身的一个引用。 17. 我不清楚python的meta programming能到什么程度,只好等大牛来说说了。只是觉得pythoner不常用那个,也许觉得会把程序逻辑搞得晦涩不明。 18. ruby从perl继承了一部分难看的东西,比如很多预定义的$x常量 19. ruby内建正则表达,方便一点 20. ruby的yield是用来call block的。而python的yield是用来给generator输入输出值的。 21. python的库给我感觉命名规范有点不统一,有些方法用snake_case有些则用CamelCase,也许是库太多了遗留下的历史问题 22. python的三引号很漂亮,ruby的<<-XX...XX太难看了,也可以用%q{...}包裹多行文字(from qiezi) 23. ruby的类库设计中喜欢给方法添加别名,方便记忆。 另: ruby官方网站也提供了一些基本的比较。(from Robbin) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-09-25
cool koo. 俺最关心的 module, package, import, static import, require, 这些呢? |
|
返回顶楼 | |
发表时间:2006-09-25
cookoo 写道 4. python有list comprehension, ruby没有:( 用map和select先凑合着。 cookoo 写道 12. ruby有method_missing机制,python不知道有没有类似机制 我只知道有个__getattr__: class A: def a(self): print "a" def __getattr__(self, method): def test(): print method return test A().a() A().b() 这2行调用将打印出a和b。不知道还有没有别的方法,method_missing功能应该算是有了。 cookoo 写道 20. python的三引号很漂亮,ruby的<<-XX...XX太难看了 也还是可以使用%q嘛,我觉得也还看得过去。 |
|
返回顶楼 | |
发表时间:2006-09-25
有的地方我的感觉跟你不一样,
比如我比较喜欢用end,程序看起来有层次感,先是一层层的缩进去,再一层层的退回来。Python的indent很讨厌,多缩进几层后,再缩回来还得数一数。 Ruby的if/case等语句实际上是表达式,可以接在赋值号后面的,所以也不好强制indent Ruby2可能会引入keyword argument。 Ruby的yield和Python的yield是两码事,Ruby的yield相当于SmallTalk的value,是对block求值的。Python的yield我记得是可以用来生成Generator的。coroutine我怎么记得是用Continuation实现的,这样的话Ruby应该也能实现,而且Ruby的Generator就是用Continuation实现的。 Ruby和Python里都有一些比较丑的东西,Ruby的Perl变量,Python的self和双下划线。另外我比较不能理解的是像abs这样只对数字有用的函数为什么要放到builtin模块 Python的模块好像做得比较好,还有Package初始化。 |
|
返回顶楼 | |
发表时间:2006-09-25
buaawhl 写道 cool koo. 俺最关心的 module, package, import, static import, require, 这些呢? python可以用from x import y导入x模块的y到当前命名空间;ruby要么include一个module里所有的顶层对象名,要么只require然后X::Y这么用。当然这不是大问题,module设计的时候用命名域切分就行了,然后include X::Y也是一样的。至于python的包有__init__.py,ruby就直接写在被require的文件里了,效果也是一样。 |
|
返回顶楼 | |
发表时间:2006-09-25
不错,cookoo 的总结信息量很丰富啊。
|
|
返回顶楼 | |
发表时间:2006-09-25
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/
|
|
返回顶楼 | |
发表时间:2006-09-25
njmzhang 写道 有的地方我的感觉跟你不一样,
比如我比较喜欢用end,程序看起来有层次感,先是一层层的缩进去,再一层层的退回来。Python的indent很讨厌,多缩进几层后,再缩回来还得数一数。 Ruby的if/case等语句实际上是表达式,可以接在赋值号后面的,所以也不好强制indent ruby的end有很多办法避免使用,但是不得已出现深度嵌套的时候就很难看了。 引用 Ruby的yield和Python的yield是两码事,Ruby的yield相当于SmallTalk的value,是对block求值的。Python的yield我记得是可以用来生成Generator的。coroutine我怎么记得是用Continuation实现的,这样的话Ruby应该也能实现,而且Ruby的Generator就是用Continuation实现的。 嗯,这是两个完全不同的东西,比较失当。python2.5的yield只是多了传值给generator功能,是我误解了成能实现coroutine了。 |
|
返回顶楼 | |
发表时间:2006-09-25
robbin 写道 http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/
哈,看来我忘了很多基本的东西,惭愧 |
|
返回顶楼 | |
发表时间:2006-09-25
robbin给的link不错。 说实话,我对ruby, python的一点知识,都是从这类比较资料上来的。这方面的资料太多了,简直罄竹难书。 不过,好东西不嫌多,cookoo的这个总结,又列出了和其他资料不重合的独特的东西。 我看过最全的一个 From Python to Ruby 来自于一本叫做 The Ruby Way的一本书。简直太全了。只列出条目了。内容很多,可以细看。(小朋友们,请不要问哪里有这本书这类问题) From Python to Ruby A Different World View A Different Program Model Some Syntax Differences Keywords Variable Prefixes Objects Methods Methods and Dot Notation Method Calls and Parentheses Method Naming Conflicts Parameters and Default Arguments procs and iterator Blocks Statements and Expressions Basic I/O Numbers Strings True and False Values Arrays Dictionaries Are Hashes Classes Modules Threading Model, Exception Handling Garbage Collection Extensions Some More Equivalencies Other Notes |
|
返回顶楼 | |