为什么Ruby比Python更适合Rails?

时间:2009-07-08 16:55:24

标签: python ruby-on-rails ruby web-frameworks

Python和Ruby通常被认为是具有相似表现力和力量的近亲(虽然具有截然不同的历史包袱)。但有些人认为Rails框架的巨大成功确实与它所构建的语言有很大关系:Ruby本身。那么为什么Ruby比Python更适合这样的框架?

13 个答案:

答案 0 :(得分:170)

可能存在两个主要差异:

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

匿名闭包/ lambdas可以更容易地模拟需要块的新语言功能。在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方法也采用String,因此可以在创建类时动态创建方法,这些方法根据传入的参数具有不同的语义。

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

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

答案 1 :(得分:58)

那些争论的人

  

Rails的巨大成功   框架真的有很多   使用它构建的语言

是(IMO)错误的。这种成功可能更多地归功于聪明和持续的营销,而不是任何技术实力。 Django可以说在许多方面做得更好(例如内置的kick-ass管理员),而不需要Ruby的任何功能。我根本不是在嘲笑Ruby,只是为了支持Python!

答案 2 :(得分:54)

蟒蛇社区认为,以最简单,最直接的方式做事是最优雅的形式。红宝石社区认为,以巧妙的方式做事,允许酷代码是最优雅的形式。

如果你遵循某些惯例,那么Rails就是关于它的,其他一些东西会神奇地发生在你身上。用红宝石的方式看世界真的很好,但并没有真正遵循python的方式。

答案 3 :(得分:26)

这场辩论是否是一场新的“vim vs. emacs”辩论?

我是一名Python / Django程序员,到目前为止,我从未在该语言/框架中发现过导致我切换到Ruby / Rails的问题。

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

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

答案 4 :(得分:25)

就我个人而言,我发现红宝石在很多方面都优于蟒蛇,这种方式构成了我称之为“一致的表现力”。例如,在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'

随着时间的推移,这些微不足道的差异很多。

另外,我想不出更好的方法来引入不可见的逻辑错误,而不是使空白显着。

答案 5 :(得分:15)

真正的答案是无论 Python还是Ruby都是Web框架的更好/更差的候选者。如果你想要客观性,你需要在两者中写一些代码,看看哪个最适合你的个人偏好,包括社区。

大多数争论一个或者其他人的人要么没有认真使用过其他语言,要么就他们的个人偏好进行“投票”。

我猜大多数人都会决定先与他们联系,因为它教会了他们新的东西(MVC,测试,生成器等)或做了更好的事情(插件,模板等)。我曾经用PHP开发并且与RubyOnRails联系。如果在找到Rails之前我已经了解过MVC,我很可能永远不会让PHP落后。但是一旦我开始使用Ruby,我就会喜欢语法,功能等。

如果我首先找到了Python及其MVC框架之一,那么我很可能会赞美这种语言!

答案 6 :(得分:11)

Python有许多类似Rails的框架。在PyCon的典型演讲中,至少有一个网络框架可以看到光明,有很多玩笑。

Rubys元编程使其更适合的论点是IMO不正确。你不需要像这样的框架进行元编程。

所以我认为我们可以得出结论,Ruby在这方面并不比Python更好(也可能更糟)。

答案 7 :(得分:8)

因为开发Rails是为了利用Rubys功能集。

同样没有问题的问题是“为什么Python比Ruby更适合Django?”。

答案 8 :(得分:4)

我想我们不应该讨论本身的语言功能,而是讨论各社区对语言功能的重音。例如,在Python中,重新打开一个类是完全可能的,但它并不常见;然而,在Ruby中,重新开放课程是日常实践中的一部分。这使得框架可以快速,直接地定制到当前需求,并使Ruby比任何其他动态语言更有利于Rails类框架。 因此我的回答是:重新开放课程的常用方法。

答案 9 :(得分:1)

有些人说,使用ActiveRecord(rails的一个关键组件)所需的元编程类型在ruby中比在python中更容易和更自然 - 我还不知道python;),所以我无法亲自确认这句话。

我简单地使用了rails,它使用catchalls / interceptor和动态评估/代码注入确实允许你在比其他一些框架(在它的时间之前)更高的抽象级别上运行。我对Python的框架几乎没有经验 - 但我听说它同样有能力 - 并且python社区在支持和促进pythonic努力方面做得很好。

答案 10 :(得分:1)

我认为语法更清晰,至少对我而言,Ruby只是更加“愉快” - 就像主观一样!

答案 11 :(得分:-1)

两个答案:

一个。因为rails是为ruby编写的。

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

答案 12 :(得分:-6)

所有这一切都完全是“恕我直言”

在Ruby中有一个Web应用程序框架,因此它是唯一为该语言做广告的框架。

Python从一开始就有过几个,仅举几例:Zope,Twisted,Django,TurboGears(它本身是其他框架组件的混合),Pylons(Rails框架的有点克隆),等等。它们都不是python-community范围内支持的“使用者”所以所有“groundwell”都分布在几个项目中。

由于Rails,Rails仅具有社区规模,或者至少在绝大多数情况下具有社区规模。

Python和Ruby都能完美地完成Web应用程序框架的工作。使用你和你的潜在开发团队一样,并且可以保持一致。