`
cookoo
  • 浏览: 644460 次
  • 性别: Icon_minigender_1
  • 来自: Shanghai
社区版块
存档分类
最新评论

Ruby和Python的语法差别

    博客分类:
  • Ruby
阅读更多
布娃娃在另一个帖子提到很多差别,我觉得和那个主题不符,所以另外开一个贴讨论吧。

其实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)
分享到:
评论
17 楼 ajoo 2006-10-10  
我说几个ruby让我不爽的地方,pythoner来说说python是不是更好

1。block/proc的区别。概念冗余。而且造成meta-code写起来有障碍。python是不是只有lambda?
2。require不是像java的import一样只输入符号表,而是执行一个文件。更象c的#include。而且require还不能有效检查两个文件是否相同。
3。没有包私有概念。
4。没有一个module loader的概念。一个库的文件之间依赖,还要写require 'mylibname/filename'。这个mylibname很别扭。
5。string不是unicode的。
6。string是mutable的。
16 楼 cookoo 2006-10-10  
Jamsa 写道
为什么说python要写getter/setter呢?直接赋值不就可以了,又没有保护

getter/setter是基本OO封装概念,ruby里局部变量默认全是private的,不写getter/setter就没法访问
15 楼 cookoo 2006-10-10  
刑天战士 写道
cookoo 写道
6. python的self很讨厌,ruby没有那种繁琐的东西

ruby也有self吧,当年理解self.some_method()花了好长时间,不过可能和python中的self不是一个概念……


python的self比较冗余,比如
class MyTextWidget(Widget):

    def __init__(self, master, text="", font="times", color="black"):
        Widget.__init__(self, master)
        self.font = self.ui_font(color, font)
        self.text = text

    def ui_handle_repair(self, draw, x0, y0, x1, y1):
        draw.text((0, 0), self.text, self.font)

ruby的实例方法不需要用self明确绑定,另外使用@来表示实例变量。
14 楼 Jamsa 2006-10-10  
test ajax
13 楼 Jamsa 2006-10-10  
为什么说python要写getter/setter呢?直接赋值不就可以了,又没有保护
12 楼 刑天战士 2006-10-10  
cookoo 写道
6. python的self很讨厌,ruby没有那种繁琐的东西

ruby也有self吧,当年理解self.some_method()花了好长时间,不过可能和python中的self不是一个概念……
11 楼 Nicholas_Ding 2006-09-29  
原话可能是 "Smalltalk did that twenty years ago" 和 "Nothing has been invented since Lisp"。
10 楼 ShiningRay 2006-09-27  
cookoo 写道
布娃娃在另一个帖子提到很多差别,我觉得和那个主题不符,所以另外开一个贴讨论吧。

其实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输入输出值的。
19. python的库给我感觉命名规范有点不统一,有些方法用snake_case有些则用CamelCase,也许是库太多了遗留下的历史问题
20. python的三引号很漂亮,ruby的<<-XX...XX太难看了,也可以用%q{...}包裹多行文字(from qiezi)
21. ruby的类库设计中喜欢给方法添加别名,方便记忆。

另: ruby官方网站也提供了一些基本的比较。(from Robbin)



A说它X,B就笑了;B说它Y,C就笑了……
9 楼 buaawhl 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
8 楼 cookoo 2006-09-25  
robbin 写道
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/

哈,看来我忘了很多基本的东西,惭愧
7 楼 cookoo 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了。
6 楼 robbin 2006-09-25  
http://www.ruby-lang.org/en/documentation/ruby-from-other-languages/to-ruby-from-python/
5 楼 uncutstone 2006-09-25  
不错,cookoo 的总结信息量很丰富啊。
4 楼 cookoo 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的文件里了,效果也是一样。
3 楼 njmzhang 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初始化。
2 楼 qiezi 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嘛,我觉得也还看得过去。
1 楼 buaawhl 2006-09-25  

cool koo.

俺最关心的
module, package, import, static import, require,
这些呢?

相关推荐

    使用Python Lua和Ruby语言进行游戏编程

    首先,Python以其简洁易读的语法和丰富的库支持而闻名,使其成为初学者和专业人士的理想选择。在游戏编程中,Python可以用于创建游戏逻辑、管理游戏状态、处理用户输入以及与其他系统集成。例如,Pygame是Python中一...

    Ruby和Python貌相近设计思想却相异

    Ruby 和 Python 作为两种流行的高级编程语言,在设计思想和语法特性上既有相似之处,也有显著的差异。这两种语言都强调代码的可读性和简洁性,但它们在实现这些目标时采取了不同的策略。 首先,Ruby 的 `case` 语句...

    sciTE 编辑器,支持Ruby,Python

    sciTE特别强调对Ruby和Python的支持,这意味着它为这两种语言提供了丰富的语法高亮、代码自动完成和代码折叠等特性。这对于Ruby和Python开发者来说,能够提高编写和阅读代码的效率,减少错误并提升开发体验。 - **...

    用Python,Lua和Ruby语言设计游戏

    标题提到的"用Python, Lua 和 Ruby语言设计游戏",这三种动态语言各自拥有独特的优点,适用于不同的游戏开发场景。接下来,我们将深入探讨每种语言在游戏开发中的应用、特点以及它们如何协同工作。 **Lua** Lua 是...

    Ruby、Python不能威胁Java的13个理由

    而Ruby、Python等语言的语法差异较大,学习曲线较陡峭,不易于广泛应用。 2. **分心效应**:程序员需要投入大量精力学习多种语言,而大多数语言的语法和概念各异,分散了注意力,不利于深度掌握。 3. **市场稳定性...

    rubypython:Ruby和Python之间的进程内。 即将更改回购地址

    标题中的“rubypython”指的是一个项目,它旨在实现Ruby和Python编程语言之间的互操作性。这个项目允许在同一个进程中调用Ruby代码和Python代码,实现了两种语言的桥梁。"即将更改回购地址"可能意味着项目的源代码...

    Ruby对比Python的优势和劣势

    这种差异部分源于Python更加简洁易懂的语法,以及其在学术界和科研领域的广泛应用。 #### 结论 总体而言,Ruby和Python各有所长。Ruby在Block特性和Mac平台集成方面展现出独特的优势;而Python则在性能优化和第三...

    用Python,Lua和Ruby语言设计游戏-Game.Programming.with.Python.Lua.And.Ruby

    Python适合快速开发和原型验证,Lua则在大型游戏引擎中广泛应用,而Ruby则为喜欢其语法风格的开发者提供了另一种选择。在实际项目中,开发者通常会结合这些语言的特点,根据游戏的需求和团队的技术栈来选择最合适的...

    用Python,Lua和Ruby语言设计游戏-Game.Programming.with.Python.Lua.And.Ruby.

    在游戏开发领域,Python、Lua和Ruby这三种脚本语言因其简洁、高效和易学习的特点,逐渐成为开发者们的首选工具。《用Python,Lua和Ruby语言设计游戏-Game.Programming.with.Python.Lua.And.Ruby》这本书深入探讨了...

    Python & Ruby 学习

    Python 和 Ruby 都是流行的高级编程语言,广泛应用于Web开发、数据分析、自动化脚本等多个领域。以下是对这两个语言的一些核心知识点的详细说明: **Python** 1. **基础语法**:Python 以其简洁易读的语法著称,如...

    Ruby-pygmentsrbPythonpygments语法高亮显示的一个Ruby包装器

    总之,`pygments.rb` 作为 `Pygments` 的 Ruby 包装器,为 Ruby 开发者提供了强大的语法高亮功能,提高了代码的可读性和项目的整体质量。通过使用这个库,开发者可以轻松地将代码高亮整合到他们的应用、博客或者文档...

    Python和Ruby比较优缺点共1页.pdf.zip

    Python和Ruby都是高级编程语言,它们在Web开发、脚本编写、数据分析等领域有着广泛的应用。这份资料《Python和Ruby比较优缺点共1页.pdf》可能是对这两种语言在特性、性能、社区支持、学习曲线等方面的对比分析。虽然...

    ruby测试代码1

    在Ruby编程语言中,测试代码扮演着至关重要的角色,它确保了代码的质量和可靠性。"ruby测试代码1"可能指的是一个具体的测试用例或者测试框架的实例,用于验证Ruby程序的功能和性能。Ruby提供了多种测试工具,如...

    PHP、Python、Ruby的(数据库、文件)比较(原创)

    在文件操作方面,三者都能满足基本需求,但Python和Ruby的语法通常被认为更易读,Python的os模块和Ruby的File类提供了高度封装的操作。PHP虽然可能需要更多的代码来实现相同功能,但在某些特定场景下,其文件处理...

Global site tag (gtag.js) - Google Analytics