Python和Ruby通常被认为是密切相关的表亲(尽管它们有着相当不同的历史背景),具有类似的表达力和能力。但是一些人认为,Rails框架的巨大成功确实与它所建立在的语言:Ruby本身有很大关系。那么为什么Ruby比Python更适合这样的框架呢?
Python和Ruby通常被认为是密切相关的表亲(尽管它们有着相当不同的历史背景),具有类似的表达力和能力。但是一些人认为,Rails框架的巨大成功确实与它所建立在的语言:Ruby本身有很大关系。那么为什么Ruby比Python更适合这样的框架呢?
可能存在两个主要区别:
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
可以接受一个字符串参数,因此在创建类的同时,可以动态创建具有不同语义的方法,取决于所传递的参数。
实际上,在Python(以及其他一些语言)中也可以进行这种元编程,但Ruby更加先进,因为元编程不是一种特殊的编程风格,而是从Ruby的对象模型和代码执行机制中自然流露出来的。因此,Class
本身也是一个对象,类体具有指向该类的self
,您可以在创建类时对类调用方法。
这在很大程度上解释了Rails中可实现声明性编程的程度,以及我们能够轻松实现新的声明性特性,看起来像关键字或新的块语言特性。
认为Rails框架的巨大成功与其所依赖的语言有很大关系的人是错误的(IMO)。这种成功可能更多地归功于聪明而持久的市场营销,而不是任何技术上的造诣。Django 在许多领域(例如内置的强大管理员)可能做得更好,而无需使用Ruby的任何特性。我并不是在贬低Ruby,只是在支持Python!
Python社区认为以最简单和直接的方式完成事情是最高的优雅形式。Ruby社区认为以允许编写酷代码的巧妙方式完成事情是最高的优雅形式。
Rails完全基于约定,如果您遵循某些约定,许多其他事情将神奇地发生在您身上。这非常符合Ruby看待世界的方式,但并不完全遵循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'
有很多这些小差异,随着时间的推移会逐渐积累。
而且,我想不出比使空格变得重要更好的方法来引入隐藏的逻辑错误了。
这场辩论是新的“vim vs emacs”辩论吗?
我是Python / Django程序员,到目前为止,我还没有发现该语言/框架存在导致我转向Ruby / Rails的问题。
我可以想象如果我有Ruby / Rails的经验,情况也会是一样的。
两者都有类似的哲学,并以快速优雅的方式完成工作。更好的选择是你已经知道的。
Python和Ruby都不是更好/更差的web框架候选者。如果想要客观性,您需要在两种语言中编写一些代码,然后查看哪种最符合您的个人偏好,包括社区。
大多数辩论其中一种语言的人要么从未认真使用过另一种语言,要么是为他们个人偏好“投票”。
我猜想大多数人定居于首先接触到的内容,因为它教给他们一些新东西(MVC,测试,生成器等)或做得更好(插件,模板等)。我曾经用PHP开发,并与RubyOnRails接触过。如果我在发现Rails之前知道了MVC,我很可能永远不会放弃PHP。但是,一旦我开始使用Ruby,我就喜欢语法、功能等等。
如果我首先发现Python及其MVC框架,我很可能会赞扬那种语言!
Python有许多类Rails的框架。它们的数量非常之多,以至于一个笑话是在PyCon上的典型演讲中,至少会谈到一个Web框架。
我认为Ruby的元编程能力更适合这种情况的观点是不正确的。对于这样的框架,您不需要元编程技巧。
因此,我认为可以得出结论:在这方面,Ruby并不比Python更好(也很可能不会更差)。
我认为我们不应该讨论语言特性本身,而是应该关注各个社区对语言特性的重点。例如,在Python中,重新打开一个类是完全可能的,但并不常见;然而在Ruby中,重新打开一个类是日常实践的一部分。这使得框架能够快速简单地定制到当前需求,并使得Ruby比其他动态语言更适合于类似Rails的框架。
因此我的答案是:重新打开类的常见使用。
有人说,为了使ActiveRecord(Rails的关键组件)成为可能所需的元编程类型在Ruby中比Python更容易且更自然 - 我还不会Python;),因此我无法亲自确认这个说法。
我曾经简要使用过Rails,它使用的catchalls/拦截器和动态评估/代码注入确实允许您在比其他框架(在其时代之前)更高的抽象级别上操作。我对Python的框架几乎没有任何经验 - 但我听说它同样具备能力 - 并且Python社区在支持和培育Pythonic事业方面做得非常出色。