旁观者清 Python与Ruby各有千秋(1)

【51CTO独家特稿】关于Ruby和Python之间的对比在网上有太多的口水,但我却没有发现真正有用的讨论,因为大家总是围绕双方的功能差异进行争辩,这样下去显得毫无意义,其实该有的双方都会有,要不然有一方肯定早已被另一方消灭。

51CTO推荐阅读:Python线程编程比Ruby应用的优点

虽然我个人更喜欢Python,但并不代表Python就比Ruby功能要多,要比Ruby强大,也无法教唆其他人也跟我一样选择Python,因为每个人的口味都不一样。因此,客观地列出双方的不同点能够有效地避免大量的口水之争,注意我们不谈语法上的差异,那完全没有意思,另外,如果你觉得本文列出的项目有带有主观色彩的,你也可以谈谈你的看法。

Ruby在类主体中有类引用

在Ruby中,你可以引用类主体中的类(self),在Python中就不行。Ruby代码示例:

    classKaka putsself end

这里的self是一个类,上面这串代码将会输出“KaKa”,在Python中,没有办法输出类名或从类定义主体中访问类。

Ruby中的所有类都是可变的

它允许你为核心类开发扩展,下面是一个rails扩展示例:

    classString defstarts_with?(other) head=self[0,other.length] head==other end end

Python(假设没有’’.startwith方法):

    defstarts_with(s,prefix): returns[:len(prefix)]==prefix

你可以在任何序列(不只是字符串)上使用它,但必须明确地导入它,如:

    fromsome_moduleimportstarts_with

Ruby有类似Perl的脚本功能

Ruby有一个regexps类,$-变量,awk/perl逐行输入循环和其它功能使它更适合编写小型shell脚本。

Ruby有类延续

Ruby有这个特性都是得益于callcc语句。在Python中,你可以用多种不同的技术创建延续,但语音本身并没有内置支持这项特性。

Ruby有块

使用do语句,你可以在Ruby中创建多行匿名函数,它将会作为一个参数传递给do前面的方法。在Python中,你可以传递一个方法或使用发生器实现同样的目的。

    Ruby: amethod{|here| many=lines+of+code goes(here) }

Python(Ruby块与Python中不同的构造对应):

    withamethod()ashere:#`amethod()isacontextmanager many=lines+of+code goes(here)

    forhereinamethod():#`amethod()`isaniterable many=lines+of+code goes(here)

    deffunction(here): many=lines+of+code goes(here) amethod(function)#`function`isacallback

有趣的是,Ruby中调用块的语句叫做“yield”,在Python中它将创建一个发生器。

Ruby:

    defthemethod yield5 end themethoddo|foo| putsfoo end

Python:

    defthemethod(): yield5 forfoointhemethod(): printfoo

虽然原理不一样,但结果非常类似的。

Ruby支持更容易的功能性编程(管道式)

    myList.map(&:description).reject(&:empty?).join("\n")

Python:

    descriptions=(f.description()forfinmylist) "\n".join(filter(len,descriptions))

人爱美,不仅需要服饰居室之美,还需要心灵品德之美。

旁观者清 Python与Ruby各有千秋(1)

相关文章:

你感兴趣的文章:

标签云: