当前位置:  开发笔记 > 编程语言 > 正文

为什么Ruby比Python更适合Rails?

如何解决《为什么Ruby比Python更适合Rails?》经验,为你挑选了8个好方法。

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



1> Yehuda Katz..:

可能存在两个主要差异:

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  

这将打印"你好".该class_eval方法还采用String,因此可以在创建类时动态创建方法,这些方法基于传入的参数具有不同的语义.

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

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


在Python中,一切都是对象,所有代码行也都是直接执行的.;)但是,你没有一个"self"指向类体中的类,直到类定义之后才会创建它,所以你必须在Python之后放入那些代码,这无疑是不太优雅的,但功能相同.
@lennart这就是重点.Python允许你在创建类之后使用命名的lambdas,装饰器和放置代码来执行相同类型的操作,但是优雅的损失会迅速增加并使得像Rails这样的东西要么明显难以实现,要么明显不那么优雅的最终用户.
@lennart我有点困惑.我说你在Python中不需要它们 - 但是没有它们使代码更难实现或者对最终用户(一个或另一个)不那么优雅.这些语言很完整 - 如果你愿意,你可以在C语言中编写Rails.
它们看起来并不像我的主要差异.
@lennart现在我们正在进入主观领域,但是在制作混合了声明和程序编程的框架时,我所谈到的两个特性非常方便.特别是缺乏匿名lambda是Python的表达限制.缺乏一致性(仅在创建类之后才需要使用创建的类)也是非常有限的.
有关这方面的一个很好的例子,请看一下Merb/Rails的路由器与Django的路由器.在去年的MerbCamp上,我们讨论了"Merb社区可以向Django学习的东西".当然,管理员和"应用程序"的概念突出显示.但他也热情地喜欢Merb风格的路由器到Django的,如果没有使用匿名的lambda,那将会显着降低表现力.
@lennart此时你只是一遍又一遍地重复你的主观意见.这篇文章已经因主观而被关闭了,如果你只是让你的主观评论独立并且不再重复它们,那么此时可能会有所帮助.
我喜欢你不必在常规语法中使用"=>",":","@"或"<"这一事实.这些是特殊字符,在精心设计的语言中仅用于特殊目的,例如分隔字典的键值对,或使用装饰器,或(反向)意义大于或等于或小于.让我简单一点:没有编程经验,你无法看到Ruby并开始理解任何东西.

2> Vinay Sajip..:

那些争论的人

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

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


@To downvoters:我真的不介意,但我很想知道为什么你认为我的答案是*无益*.我没有意识到有人因为一个人不同意某人的立场 - 我通常只是在我认为某个问题或答案以某种方式使事情变得更糟的情况下被投票.
好吧,我们在这里进入主观领域.如果您认为管理员是"唯一的",那么也许是因为您没有享受它带来的节省时间的好处.有没有你认为Django比Rails更糟糕的领域,因为Ruby具有的功能和Python没有?问题的关键不在于哪个框架更好 - 而是(正如在这个问题的其他地方指出的那样)Python中缺少任何东西,这使得它不太能够开发一个kick-ass框架.根据证据,没有这样的缺陷.
@railsninja:对你有好处.我不想为大多数系统需要的管理员家务杂务编写样板页面.最近,我为一家当地的慈善网站做了一些无偿工作,如果Django管理员不是这个方程式的话,根本不可能做那个网站.事实上,我为最终用户提供了一个相当自定义的Ajax化UI的站点,但后端管理员与管理员合作,这对他们的需求来说已经足够了.
@Matt:他的问题是为什么Ruby比Python更合适..答案,非常正确,它不是.
我可以编写自己的管理部分,我不需要这是在框架中.我更喜欢其他方法使我的应用程序更容易编写.
营销就像"每个使用它的人都喜欢谈论他们喜欢它的程度"一样?我会说Django至少和rails一样具有良好的营销效果,它只是没有存在多久.
"例如内置的踢屁股管理员"?更像是"只有内置管理员".这是一个很棒的功能,但除非你喜欢Python,否则我无法想到任何其他值得注意的东西而不是Rails.
@Matt:我认为我的确回答了他的问题:(a)我想到了Rails成功的可能原因;(b)Django的存在,至少比Rails更好*区域,证明了Ruby不一定比Python更适合在同一空间中开发框架.显然在这种情况下*更多*必须是主观测量而不是客观测量.

3> Matt Briggs..:

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

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


"任何足够先进的技术都与魔术无法区分." --Arthur C. Clarke
当然,但Perl人的丢失(好吧,也许不是*很多*)谁认为神秘的单行很酷,许多Lisp人发誓这是一种真正的语言.我们肯定在任何浮动你的船领土.
Rails没有魔法,它就在源头.如果你想知道如何,你的屁股,找出来.
优雅和惯例并不代表魔法.

4> luc..:

这场辩论是否是一场新的"vim与emacs"辩论?

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

我可以想象,如果我对Ruby/Rails有经验,那就相同了.

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



5> fields..:

就个人而言,我发现红宝石在很多方面都优于蟒蛇,这些方式构成了我称之为"一致的表现力".例如,在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也是如此:http://stackoverflow.com/questions/520228/is-ruby-strongly-or-weakly-typed你也不能在Ruby中为整数添加字符串.我已经厌倦了纠正你,请在你将来回答之前检查你的事实.
如果你试图将非字符串添加到字符串中,就像在Join中一样,这是正确的.这是因为显式优于隐式.Python中的自动转换很少,其原因是它们往往会导致问题,特别是在动态语言中,因为事情最终不是您期望的类型.当然".join()方法确实在开始时感觉倒退,但这就是原因.它实际上在列表中没有意义......
在具有开头和结尾的语言中以及使用大括号和汇编语言的语言中,我看到代码被粘贴错误并在以后引起麻烦.这总是一个问题.对于那些严重粘贴Python的人来说,你遇到了很多麻烦吗?
Whitespace在Python中并不重要:http://www.secnetix.de/~olli/Python/block_indentation.hawk.由于Python中的缩进而引入"隐形错误"几乎是不可能的(你必须捏造你的编辑器设置),当然完全有可能因为任何其他语言的缩进而引入不可见错误,只是通过缩进不正确.@fields:所以不要通过Skype或HTML复制代码.吉兹.
是的,除了Python是强类型的.
对我而言,我需要在Ruby中浪费大量的空间,而不是弥补缺乏模糊的"好"特征.
Google的短语'python is strong typed'.这是相当一致的

6> Kris..:

真正的答案是既不 Python或Ruby是一个Web框架更好/更糟糕的候选人.如果你想要客观性,你需要在两者中写一些代码,看看哪个最适合你的个人偏好,包括社区.

争论一个或者其他人的大多数人都没有认真地使用过其他语言,或者为了个人喜好而"投票".

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

如果我首先找到了Python和它的一个MVC框架,那么我很可能会赞美这种语言!



7> Lennart Rege..:

Python有很多类似Rails的框架.有太多笑话,在PyCon的典型谈话中,至少有一个Web框架会看到光明.

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

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



8> Paddy3118..:

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

类似的没有问题的问题是"为什么Python比Ruby更适合Django?".

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有