zoukankan      html  css  js  c++  java
  • ruby python syntx compare

    论坛首页  Ruby编程版  ruby  

    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)
     
       发表时间:2006-09-25  

    cool koo.

    俺最关心的
    module, package, import, static import, require, 
    这些呢?
    0  请登录后投票
     
       发表时间:2006-09-25  
    cookoo 写道

    4. python有list comprehension, ruby没有:( 

    用map和select先凑合着。 
    cookoo 写道

    12. ruby有method_missing机制,python不知道有没有类似机制 

    我只知道有个__getattr__: 
    Java代码 
    1. class A:  
    2.     def a(self):  
    3.         print "a"  
    4.   
    5.     def __getattr__(self, method):  
    6.         def test():  
    7.             print method  
    8.         return test  
    9.   
    10. A().a()  
    11. A().b()  

    这2行调用将打印出a和b。不知道还有没有别的方法,method_missing功能应该算是有了。 
    cookoo 写道

    20. python的三引号很漂亮,ruby的<<-XX...XX太难看了 

    也还是可以使用%q嘛,我觉得也还看得过去。
    0  请登录后投票
     
       发表时间: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初始化。
    0  请登录后投票
     
       发表时间: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的文件里了,效果也是一样。
    0  请登录后投票
     
       发表时间:2006-09-25  
    不错,cookoo 的总结信息量很丰富啊。
    0  请登录后投票
     
       发表时间:2006-09-25  
    http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/
    0  请登录后投票
     
       发表时间: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了。
    0  请登录后投票
     
       发表时间:2006-09-25  
    robbin 写道
    http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/

    哈,看来我忘了很多基本的东西,惭愧
    0  请登录后投票
     
       发表时间: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
    0  请登录后投票
     
    论坛首页  Ruby编程版  ruby 

    跳转论坛:
  • 相关阅读:
    CentOS 网络配置
    BUUCTF-PWN爬坑-04-pwn1_sctf_2016
    BUUCTF-PWN爬坑-03-warmup_csaw_2016
    BUUCTF-PWN爬坑-02-rip
    此博客早八百年已停止维护
    重&长剖
    FHQ Treap
    NOIP2020游记
    CSP2020 游记
    线段树套平衡树
  • 原文地址:https://www.cnblogs.com/lexus/p/1881485.html
Copyright © 2011-2022 走看看