为什么Ruby比Python更适合Rails?[关闭]


90

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


44
头韵。_
吉米

75
“ Pails on Pails”对它的感觉不一样……
短暂

105
@Ephemient:我相信它将是飞机上的Python。
吉米

37
@吉米:谁需要飞机?进口反重力;-) xkcd.com/353
Vinay Sajip,2009年

157
Jails中有Java吗?
Nosredna

Answers:


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

匿名闭包/ 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方法还带有一个String,因此可以在创建类时动态创建方法,这些方法根据传入的参数具有不同的语义。

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

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


40
在Python中,一切都是对象,所有代码行也都直接执行。;)但是,您没有指向类主体中的类的“自我”,只有在类定义之后才能创建该“自我”,因此您必须将该代码放到Python中,这显然不太优雅,但功能等效。
Lennart Regebro

31
@lennart就是这样。Python允许您使用命名的lambda,装饰器和创建类后的代码来执行相同的操作,但是优雅的损失很快就会加起来,并且使诸如Rails之类的东西明显变得更难实现,或者对于最终用户而言明显不那么优雅。
Yehuda Katz,2009年

9
在我看来,它们看起来并不像主要差异。
Dietrich Epp

10
@lennart我有点困惑。我说过,您在Python中并不需要它们,但是没有它们会使代码更难以实现或对最终用户(一个或另一个)不太美观。语言已经完成-如果需要,您可以用C编写Rails。
Yehuda Katz,2009年

5
@lennart现在我们进入了主观领域,但是在生成将声明性程序和过程性程序混合在一起的框架时,我谈论的两个功能非常方便。缺少匿名Lambda尤其是Python的表达限制。缺乏一致性(仅在创建AFTER类之后才需要与创建的类一起工作)的局限性也相当大。
Yehuda Katz,2009年

58

那些争论过的人

Rails框架的巨大成功确实与它所基于的语言有很大关系

(IMO)是错误的。这种成功可能更多归功于聪明而持久的营销,而不是任何技术能力。可以说Django在许多方面都可以做得更好(例如内置的kick-ass管理员),而无需使用Ruby的任何功能。我根本没有在讲Ruby,只是站在Python之上!


10
好吧,我们在这里进入主观领域。如果您认为管理员是“唯一的”,那也许是因为您没有享受到它所提供的节省时间的好处。您是否认为在某些方面由于Ruby具有和Python没有的特性,Django比Rails更糟糕?重点实际上不是关于哪个框架更好—而是(是否在这个问题的其他地方指出了)Python是否缺少任何东西,这使得它无法开发踢屁股的框架。根据证据,不存在这样的不足。
Vinay Sajip,2009年

18
@致低级投票者:我真的不介意,但是我很好奇知道您为什么认为我的回答无济于事。我没有意识到一个人投票失败是因为有人不同意某人的立场-我通常只在我觉得一个问题或答案在某种程度上使事情变得更糟时才投票。
Vinay Sajip,2009年

5
我可以编写自己的管理部分,不需要在框架中。我更喜欢其他使我的应用程序更易于编写的方法。
nitecoder

8
@railsninja:对你有好处。我希望不必为大多数系统所需的管理内务琐事编写样板页面。最近,我为当地的一家慈善网站做了一些无偿工作,如果Django管理员不参与其中,那么根本不可能建立该网站。照原样,我为最终用户提供了一个具有相当自定义的Ajaxified UI的网站,但是后端管理员与管理员一起工作,它已经足够满足他们的需求。
Vinay Sajip,2009年

6
@Matt:他的问题是,为什么Ruby比Python更适合。。答案很正确,那就是它不适合。
Lennart Regebro

54

python社区认为,以最简单直接的方式做事是最高的优雅形式。红宝石社区认为,以聪明的方式做事以允许使用很酷的代码是优雅的最高形式。

如果您遵循某些约定,那么Rails就是所有关于神奇的事情发生的事情。用红宝石的方式看待世界真的很好玩,但是并没有真正遵循python的方式。


4
当然,但是有很多Perl人(很多,也许不是很多)认为神秘的一线很酷,并且许多Lisp人发誓这是一门真正的语言。我们绝对处在任何漂浮的地方。
Vinay Sajip,2009年

4
Rails的魔力为零,就在源代码中。如果您想知道如何做,请放开屁股,找出答案。
nitecoder

21
“任何足够先进的技术都无法与魔术区分开。” -亚瑟·克拉克(Arthur C. Clarke)
Vinay Sajip,2009年

1
“魔术”是指该框架无需直接询问即可为您完成很多事情。再一次,我不是在进行价值判断,这是一种做事有好的方面和坏的方面的风格。就我个人而言,我认为它在导轨中效果很好。
马特·布里格斯

2
优雅和惯例不代表魔术。
BJ克拉克

26

这个辩论是新的“ vim vs emacs”辩论吗?

我是Python / Django程序员,到目前为止,我从未在该语言/框架中发现任何会导致我转向Ruby / Rails的问题。

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

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


25

就我个人而言,我发现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'

随着时间的流逝,这些小差异很多。

另外,我想不出一种比使空白重要的更好的方法来引入不可见的逻辑错误。


29
我的经验是,使空白有效可以帮助消除逻辑错误。间距和语法不一致会更加令人困惑。
Nosredna,2009年

5
在带有开始和结尾的语言以及带有大括号和汇编语言的语言中,我已经看到代码粘贴错误并在以后引起麻烦。这总是一个问题。您在人们严重粘贴Python时遇到了很多麻烦吗?
Nosredna

5
空格在Python中并不重要:secnetix.de/~olli/Python/block_indentation.hawk。由于Python中的缩进,几乎不可能引入“看不见的错误”(您必须弄乱编辑器的设置),而当然,完全可以通过其他任何语言的缩进来引入不可见的错误,只需错误地缩进即可。@fields:所以不要通过skype或HTML复制代码。真是的
Lennart Regebro

7
如果您尝试向字符串中添加非字符串(例如在Join中),Python会抱怨。这是因为显式比隐式好。Python中很少有自动转换,原因是它们往往会导致问题,尤其是在动态语言中,因为最终的结果不是您期望的那种类型。当然,“”。join()方法确实在开始时会感到倒退,但这就是原因。它实际上在列表上没有意义...
Lennart Regebro 09年

8
全能的上帝...您的意思是静态键入的,不是强类型的。Python是强类型的,而Ruby也是如此:stackoverflow.com/questions/520228/… 您也不能在Ruby中将字符串添加到整数。我已经厌倦了纠正您的问题,请在以后回答之前先核实您的事实。
Lennart Regebro

15

真正的答案不是 Python或Ruby是一个Web框架更好/更糟糕的候选人。如果需要客观性,则需要在两者中都编写一些代码,然后查看最适合您的个人喜好(包括社区)的代码。

大多数主张一种或另一种语言的人要么从未认真使用过另一种语言,要么就自己的喜好“投票”。

我想大多数人都会选择首先接触哪个对象,因为它教会了他们一些新知识(MVC,测试,生成器等)或做得更好(插件,模板化等)。我曾经使用PHP进行开发,后来开始接触RubyOnRails。如果我在找到Rails之前就已经了解MVC,那么我很可能永远不会把PHP抛在后面。但是一旦我开始使用Ruby,我就会喜欢它的语法,功能等。

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


11

Python有很多类似Rails的框架。笑话太多了,以至于在PyCon上的典型演讲中,至少有一个Web框架将成为现实。

认为Rubys元编程将使其更适合的说法是不正确的。您不需要针对此类框架进行元编程。

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


8

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

一个类似的严格问题是:“为什么Python比Ruby更适合Django?”。


4

我想我们不应该讨论语言特征本身,而应该讨论各个社区对语言特征的强调。例如,在Python中,完全可以重新打开一个类,但这并不常见。但是,在Ruby中,重新打开类是日常工作。这允许根据当前需求快速直接地定制框架,并使Ruby比其他动态语言更适合于类似Rails的框架。因此,我的答案是:重新打开类的常用用法。


1

有人说,使ActiveRecord(rails的关键组件)成为可能所需的元编程类型,在Ruby中比在python中更容易和更自然地完成-我还不知道python;),所以我个人无法确认这一说法。

我已经简要地使用过rails,它对catchalls / interceptor和动态评估/代码注入的使用确实使您能够以比其他一些框架更高的抽象水平进行操作(在此之前)。我几乎没有Python框架的经验-但是我听说过它具有同样的功能-并且python社区在支持和促进pythonic方面所做的工作非常出色。


3
确实,这种“魔术”通常在Python中不被接受。例如,code.djangoproject.com
wiki /

2
我认为,出于“魔术”的缘故,“魔术”(元编程技巧)应该总是不被接受-更简单的代码,但同样强大而富有表现力的代码,应永远取胜-但在某些情况下,提供“魔术”的唯一方法是 确切的功能和语法您需要的是“魔术”-在这种情况下,“魔术”是不可或缺的;)
Faisal Vali

1

我认为语法更简洁,而且至少对我来说,Ruby更加“令人愉快”-就那样主观!



-6

全部都是“恕我直言”

在Ruby中,只有一个Web应用程序框架,因此它是唯一针对该语言发布的框架。

自成立以来,Python已经有好几种,仅举几例:Zope,Twisted,Django,TurboGears(它本身是其他框架组件的混合),Pylons(Rails框架的类似克隆)等等。它们中没有一个在python-community范围内被支持为“一个要使用的”,因此所有的“地漏”都分布在多个项目中。

由于Rails的缘故,Rails仅具有社区规模,至少在绝大多数情况下如此。

Python和Ruby都完全有能力作为Web应用程序框架来完成这项工作。像您一样使用您(和您的潜在开发团队),并保持一致。


7
ruby有多个Web应用程序框架:Nitro,Merb,Camping ..仅举几例
Brook,2009年

5
添加:Sinatra甚至是一个裸露的Rack应用程序,也可以用于非常快速,非常简单的Web应用程序。
克里斯2009年

2
-1“在Ruby中,有一个Web应用程序框架”过于明确……对于一个错误的陈述。硝基,默布,露营,西纳特拉
Maximiliano Guzman

2
对于试图梳理所有这些问题的新来者,双方的无知见解正是造成混乱的原因。这也意味着如果他们了解得更多,他们可能会错过他们真正会喜欢的东西。
Walt Jones

3
我认为他的观点是,Rails在Ruby社区中比在Django中在Python社区中占有很大的份额,这是有效的
pjb3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.