通常认为Python和Ruby是近亲(尽管具有不同的历史包容),具有相似的表现力和强大功能。但是有人认为,Rails框架的巨大成功确实与它所基于的语言(Ruby本身)有很大关系。那么,为什么Ruby比Python更适合于这样的框架?
通常认为Python和Ruby是近亲(尽管具有不同的历史包容),具有相似的表现力和强大功能。但是有人认为,Rails框架的巨大成功确实与它所基于的语言(Ruby本身)有很大关系。那么,为什么Ruby比Python更适合于这样的框架?
Answers:
可能有两个主要区别:
Rails使用它们效果很好。这是一个例子:
class WeblogController < ActionController::Base
def index
@posts = Post.find :all
respond_to do |format|
format.html
format.xml { render :xml => @posts.to_xml }
format.rss { render :action => "feed.rxml" }
end
end
end
匿名闭包/ lambda使模拟可能会阻塞的新语言功能更加容易。在Python中,存在闭包,但是必须命名闭包才能使用。因此,您不能使用闭包来模仿新的语言功能,而是必须明确使用闭包这一事实。
这在Rails中得到了广泛的使用,主要是因为它易于使用。具体来说,在Ruby中,您可以在类的上下文中执行任意代码。以下片段是等效的:
class Foo
def self.make_hello_method
class_eval do
def hello
puts "HELLO"
end
end
end
end
class Bar < Foo # snippet 1
make_hello_method
end
class Bar < Foo; end # snippet 2
Bar.make_hello_method
在这两种情况下,您都可以执行以下操作:
Bar.new.hello
它将打印“ HELLO”。该class_eval
方法还带有一个String,因此可以在创建类时动态创建方法,这些方法根据传入的参数具有不同的语义。
实际上,可以用Python(以及其他语言)进行这种元编程,但是Ruby有优势,因为元编程不是一种特殊的编程风格。它源于以下事实:在Ruby中,一切都是对象,并且所有代码行都直接执行。结果,Class
es本身就是对象,类主体self
指向Class,并且您可以在创建类时在类上调用方法。
这在很大程度上归因于Rails中可能的声明性程度,以及我们能够轻松实现看起来像关键字或新的块语言功能的新声明性功能的原因。
那些争论过的人
Rails框架的巨大成功确实与它所基于的语言有很大关系
(IMO)是错误的。这种成功可能更多归功于聪明而持久的营销,而不是任何技术能力。可以说Django在许多方面都可以做得更好(例如内置的kick-ass管理员),而无需使用Ruby的任何功能。我根本没有在讲Ruby,只是站在Python之上!
python社区认为,以最简单直接的方式做事是最高的优雅形式。红宝石社区认为,以聪明的方式做事以允许使用很酷的代码是优雅的最高形式。
如果您遵循某些约定,那么Rails就是所有关于神奇的事情发生的事情。用红宝石的方式看待世界真的很好玩,但是并没有真正遵循python的方式。
就我个人而言,我发现ruby在许多方面都优于python,其中包括我所说的“一致表现力”。例如,在ruby中,join是数组对象上的一个方法,该方法输出一个字符串,因此您将获得如下内容:
numlist = [1,2,3,4]
#=> [1, 2, 3, 4]
numlist.join(',')
#=> "1,2,3,4"
在python中,join是字符串对象上的一种方法,但是如果您将字符串以外的其他东西作为要传递的对象传递给它,则会引发错误,因此相同的构造类似于:
numlist = [1,2,3,4]
numlist
#=> [1, 2, 3, 4]
",".join([str(i) for i in numlist])
#=> '1,2,3,4'
随着时间的流逝,这些小差异很多。
另外,我想不出一种比使空白重要的更好的方法来引入不可见的逻辑错误。
真正的答案不是 Python或Ruby是一个Web框架更好/更糟糕的候选人。如果需要客观性,则需要在两者中都编写一些代码,然后查看最适合您的个人喜好(包括社区)的代码。
大多数主张一种或另一种语言的人要么从未认真使用过另一种语言,要么就自己的喜好“投票”。
我想大多数人都会选择首先接触哪个对象,因为它教会了他们一些新知识(MVC,测试,生成器等)或做得更好(插件,模板化等)。我曾经使用PHP进行开发,后来开始接触RubyOnRails。如果我在找到Rails之前就已经了解MVC,那么我很可能永远不会把PHP抛在后面。但是一旦我开始使用Ruby,我就会喜欢它的语法,功能等。
如果我首先找到了Python及其MVC框架之一,那么我很可能会称赞该语言!
有人说,使ActiveRecord(rails的关键组件)成为可能所需的元编程类型,在Ruby中比在python中更容易和更自然地完成-我还不知道python;),所以我个人无法确认这一说法。
我已经简要地使用过rails,它对catchalls / interceptor和动态评估/代码注入的使用确实使您能够以比其他一些框架更高的抽象水平进行操作(在此之前)。我几乎没有Python框架的经验-但是我听说过它具有同样的功能-并且python社区在支持和促进pythonic方面所做的工作非常出色。
全部都是“恕我直言”
在Ruby中,只有一个Web应用程序框架,因此它是唯一针对该语言发布的框架。
自成立以来,Python已经有好几种,仅举几例:Zope,Twisted,Django,TurboGears(它本身是其他框架组件的混合),Pylons(Rails框架的类似克隆)等等。它们中没有一个在python-community范围内被支持为“一个要使用的”,因此所有的“地漏”都分布在多个项目中。
由于Rails的缘故,Rails仅具有社区规模,至少在绝大多数情况下如此。
Python和Ruby都完全有能力作为Web应用程序框架来完成这项工作。像您一样使用您(和您的潜在开发团队),并保持一致。