为什么Ruby比Python更适合Rails?

Why is Ruby more suitable for Rails than Python?

python和ruby通常被认为是近亲(尽管有着截然不同的历史包袱),具有相似的表现力和力量。但有人认为,Rails框架的巨大成功与它所基于的语言(Ruby本身)有很大关系。那么为什么Ruby比Python更适合这样的框架呢?


可能有两个主要区别:

Ruby有优雅的匿名闭包。

轨道使用效果良好。下面是一个例子:

1
2
3
4
5
6
7
8
9
10
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中,可以在类的上下文中执行任意代码。以下代码段是等效的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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

在这两种情况下,您可以执行以下操作:

1
Bar.new.hello

上面印着"你好"。class_eval方法还接受一个字符串,因此可以在创建类时即时创建方法,因为类的语义基于传入的参数而有所不同。

实际上,用Python(以及其他语言)进行这种元编程是可能的,但是Ruby有一个优势,因为元编程不是一种特殊的编程风格。它源自这样一个事实:在Ruby中,所有的东西都是一个对象,所有的代码行都是直接执行的。因此,Classes本身就是对象,类实体有一个self指向类,您可以在创建类时调用类上的方法。

这在很大程度上决定了Rails中可能存在的声明性程度,以及我们能够轻松实现看起来像关键字或新的块语言特性的新声明性特性。


那些认为

the immense success of the Rails
framework really has a great deal to
do with the language it is built on

我错了。这种成功可能更多地归功于聪明和持续的市场营销,而不是任何技术能力。可以说,Django在许多领域(例如内置的kick-ass管理)都做得更好,而不需要Ruby的任何功能。我一点也不排斥鲁比,只是站在Python面前!


python社区认为,以最简单、最直接的方式做事是优雅的最高形式。Ruby社区认为,以聪明的方式做事情,允许酷代码是最优雅的形式。

如果您遵循某些约定,那么Rails就是您的一切,其他事情的负载会神奇地发生在您身上。这与红宝石看待世界的方式非常吻合,但并没有真正遵循Python的方式。


这场辩论是一场新的"VIM对EMAC"辩论吗?

我是一个python/django程序员,到目前为止,我从未在该语言/框架中发现过会导致我切换到ruby/rails的问题。

我可以想象,如果我对Ruby/Rails有经验的话,情况会是一样的。

两者都有相似的理念,并且以快速和优雅的方式完成工作。更好的选择是你已经知道的。


就我个人而言,我发现Ruby在很多方面都优于Python,这就是我所说的"一致的表现力"。例如,在Ruby中,join是array对象上的一个方法,它输出一个字符串,因此您可以得到如下结果:

1
2
3
4
numlist = [1,2,3,4]
#=> [1, 2, 3, 4]
numlist.join(',')
#=>"1,2,3,4"

在python中,join是string对象上的一个方法,但是如果您将字符串以外的东西作为要连接的东西传递给它,它就会抛出一个错误,因此相同的构造类似于:

1
2
3
4
5
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的框架。因此我的答案是:重新开课的常见用法。


我认为语法更清晰,至少对我来说,Ruby更"令人愉快"——这是主观的!


有人说,使ActiveRecord(Rails的关键组件)成为可能所需的元编程类型在Ruby中比在python中更容易、更自然——我还不知道python;),因此我不能亲自确认这一说法。

我简要地使用了rails,它使用了catchalls/interceptor和动态评估/代码注入,这使您能够以比其他一些框架(在它出现之前)更高的抽象级别进行操作。我对python的框架几乎没有经验,但我听说它同样有能力,而且python社区在支持和促进python努力方面做得很好。


两个答案:

因为Rails是为Ruby编写的。

B.出于同样的原因,C比Ruby更适合Linux


所有这些都是"imho"

在Ruby中,有一个Web应用程序框架,所以它是为该语言发布广告的唯一框架。

从一开始,python就有几个:zope、twisted、django、turbogears(它本身是其他框架组件的组合)、pylons(类似于rails框架的克隆)等等。它们中没有一个是"要使用的"Python社区范围的支持,所以所有的"groundswell"都分布在几个项目中。

由于Rails的存在,Rails拥有单独的社区规模,或者至少是绝大多数社区规模。

python和ruby都完全能够作为一个Web应用程序框架来完成这项工作。使用一个你(和你的潜在开发团队)喜欢的,并且可以与之保持一致。