Python 和 Ruby 通常被认为是近亲(尽管有着截然不同的历史包袱),具有相似的表现力和力量。但有些人认为,Rails 框架的巨大成功与它所构建的语言有很大关系:Ruby 本身。那么为什么 Ruby 会比 Python 更适合这样的框架呢?
13 回答
可能有两个主要区别:
Ruby 有优雅的匿名闭包。
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 中,存在闭包,但它们必须命名才能使用。因此,您不能使用闭包来模拟新的语言特性,而是被迫明确说明您正在使用闭包这一事实。
Ruby 具有更简洁、更易于使用的元编程。
这在 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
es 本身就是对象,类主体有一个self
指向 Class,并且您可以在创建类时调用类上的方法。
这在很大程度上决定了 Rails 中可能的声明性程度,以及我们能够轻松实现类似于关键字或新块语言特性的新声明性特性。
那些争论过的人
Rails 框架的巨大成功与它所构建的语言有很大关系
是(IMO)错误的。这种成功可能更多地归功于聪明和持续的营销,而不是任何技术实力。Django可以说在许多领域(例如内置的 kick-ass admin)做得更好,而不需要任何 Ruby 的特性。我根本不反对 Ruby,只是支持 Python!
python 社区认为,以最简单直接的方式做事是优雅的最高形式。ruby 社区相信以允许酷代码的聪明方式做事是优雅的最高形式。
如果您遵循某些约定,Rails 就是一切,大量其他事情会神奇地发生在您身上。这与 ruby 看待世界的方式非常吻合,但并不真正遵循 python 方式。
这场辩论是一场新的“vim 与 emacs”辩论吗?
我是一名 Python/Django 程序员,到目前为止,我从未在该语言/框架中发现会导致我切换到 Ruby/Rails 的问题。
我可以想象,如果我对 Ruby/Rails 有经验,那会是一样的。
两者都有相似的理念,并且以快速而优雅的方式完成工作。更好的选择是你已经知道的。
就个人而言,我发现 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 框架,我很可能会称赞该语言!
Python 有一大堆类似 Rails 的框架。有这么多,以至于在 PyCon 的典型演讲中,至少有一个 Web 框架会看到亮点。
Rubys 元编程会使其更适合的论点是 IMO 不正确的。对于这样的框架,您不需要元编程。
所以我认为我们可以得出结论,在这方面 Ruby 并不比 Python 好(也可能也不差)。
因为 Rails 是为了利用 Rubys 功能集而开发的。
一个类似的愚蠢问题是“为什么 Python 比 Ruby 更适合 Django?”。
我想我们不应该讨论语言特征本身,而应该讨论各个社区对语言特征的口音。例如,在 Python 中,重新打开一个类是完全可能的,但并不常见;然而,在 Ruby 中,重新开设课程是日常实践。这允许根据当前需求快速而直接地自定义框架,并使 Ruby 比任何其他动态语言更适合类似 Rails 的框架。因此我的回答是:重新开放课程的常见用法。
有人说,使 ActiveRecord(rails 的关键组件)成为可能所需的元编程类型在 ruby 中比在 python 中更容易和更自然——我还不知道 python;),所以我不能亲自证实这一说法。
我已经简单地使用过 Rails,它使用 catchalls/interceptors 和动态评估/代码注入确实允许您在比其他一些框架(之前)更高的抽象级别上进行操作。我对 Python 的框架几乎没有经验——但我听说它同样有能力——而且 Python 社区在支持和促进 Python 方面的努力方面做得很好。
我认为语法更简洁,至少对我来说,Ruby 更“令人愉快”——尽管如此主观!
两个答案:
一个。因为 rails 是为 ruby 编写的。
湾。出于同样的原因,C 比 Ruby 更适合 Linux
所有这一切都是“恕我直言”
在 Ruby 中只有一个 Web 应用程序框架,因此它是唯一宣传该语言的框架。
Python 从一开始就有几个,仅举几例:Zope、Twisted、Django、TurboGears(它本身是其他框架组件的组合)、Pylons(Rails 框架的一种克隆)等等。它们都没有在 python 社区范围内被支持为“使用的那个”,所以所有的“风潮”都分布在几个项目中。
由于 Rails,Rails 具有完全的社区规模,或者至少在绝大多数情况下。
Python 和 Ruby 都非常适合作为 Web 应用程序框架来完成这项工作。使用您(和您的潜在开发团队)喜欢并可以与之保持一致的人。