python和ruby通常被认为是近亲(尽管有着截然不同的历史包袱),具有相似的表现力和力量。但有人认为,Rails框架的巨大成功与它所基于的语言(Ruby本身)有很大关系。那么为什么Ruby比Python更适合这样的框架呢?
- 头韵。γ
- "桶上的Python"只是感觉不一样…
- @我相信飞机上会有Python。
- 上的python失败了?
- @吉米:谁需要飞机?进口反重力;-)xkcd.com/353
- @维尼:我相信这是对imdb.com/title/tt0417148的引用。
- @我不认识任何一个承认看过那部电影的人;—)
- 我还在等艾达上亚历斯。
- 监狱里有Java吗?
- @不,我相信那叫做Struts
- @诺思瑞德娜-只有你放下肥皂,你才会陷入痛苦的世界。
- python使用django…
- 如果Python更好地编写Rails,那么它应该是用Python编写的。Q.E.D.
- 没有什么能比得上使用拐杖的php(snafu.lailying.ch/software/php)。它还有最好的标志。
- @这是整个网站上唯一最好的评论。
- 这种类型的问题给了RoR世界一个发泄他们内心沮丧的地方,因为python以如此之快的速度(主要是由于机器人技术、航空航天和防御技术)放弃了Ruby,而Ruby永远也赶不上。(更不用说Django也在传递ror,尽管有许多其他流行的python框架可以共享市场。)
- @Nosredna:至少在C中有一个C
- @我希望是这样。
- 我不知道你们的情况,但我喜欢加冰块的苏格兰威士忌。
- 现在有了Mono,您就有了Mono Rails-但是它唯一可用的是一些国家。
- 我很想知道您的声明的来源,因为我不相信Rails的成功主要是因为Ruby语言。
可能有两个主要区别:
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 |
在这两种情况下,您可以执行以下操作:
上面印着"你好"。class_eval方法还接受一个字符串,因此可以在创建类时即时创建方法,因为类的语义基于传入的参数而有所不同。
实际上,用Python(以及其他语言)进行这种元编程是可能的,但是Ruby有一个优势,因为元编程不是一种特殊的编程风格。它源自这样一个事实:在Ruby中,所有的东西都是一个对象,所有的代码行都是直接执行的。因此,Classes本身就是对象,类实体有一个self指向类,您可以在创建类时调用类上的方法。
这在很大程度上决定了Rails中可能存在的声明性程度,以及我们能够轻松实现看起来像关键字或新的块语言特性的新声明性特性。
- 在Python中,一切都是对象,所有代码行也都直接执行。;)但是,在类体中没有指向类的"self",它直到类定义之后才被创建,因此必须将代码放在后面的python中,这显然不太优雅,但功能上是等效的。
- 鲁比让我头疼(冬虫夏草静态疼痛)
- @伦纳德,这就是重点。python允许您对命名的lambda、decorator执行相同的操作,并在创建类之后放置代码,但是优雅的损失会很快累积起来,这使得Rails这样的东西很难实现,或者对最终用户来说不那么优雅。
- 对我来说,它们看起来并不是什么大的区别。
- @Yehuda你不需要这些东西来构建一个像Rails这样的Web框架。至少在python中没有。我看不出你对装修工有什么不满。-)
- @伦纳德,我有点困惑。我说过您在Python中不需要它们——但是没有它们会使代码更难实现,或者使最终用户(其中一个或另一个)的代码不那么优雅。这些语言都是图灵完备的——如果需要的话,您可以用C语言编写Rails。
- @耶胡达:不,代码不难实现,也不那么优雅。我不熟悉Rails的内部结构,但我知道在python中,不需要任何这样的代码来生成优雅、干净的代码,这对于用户来说也是优雅、干净和容易的。我真的怀疑在铁路上也有必要。
- @Lennart现在已经进入了主观领域,但是我所讨论的两个特性在用声明性编程和过程性编程混合生成框架时非常方便。尤其是,缺少匿名lambda是Python的一个表达限制。缺乏一致性(仅在创建类之后才需要使用创建的类)也是非常有限的。
- 关于这方面的一个好例子,请看一下Merb/Rails的路由器和Django的路由器。去年在Merbcamp上,我们讨论了"Merb社区可以从Django中学到的东西"。当然,管理和"应用程序"的概念非常突出。但他也热衷于选择Merb风格的路由器,而不是Django的路由器,如果不使用匿名lambda,这种路由器的表现力会明显降低。
- 首先,您似乎声称Python中缺少Anonymous lambdas。这是一个奇怪的说法。lambda是匿名函数。如果不是匿名的,它只是一个函数。其次,在Python中不需要使用匿名lambda。或是羔羊肉。在python中任何使用lambda的地方都可以用函数代替。如果在Ruby中不是这样,那么在Ruby中这是一个奇怪的限制,而不是在Python中。
- 如果您需要在Python的构造过程中使用这些类,可以使用元类或类修饰符。我同意元类可以是毛茸茸的,而类装饰师是新的(但不是毛茸茸的)。但是你声称你需要这样做才能建立一个好的WebFramework,但是你和其他人都没有提供任何关于为什么使用这些东西的WebFramework会更好的论据。由于缺乏论证,我的结论是这是胡说八道。
- @Lennart我认为你需要再看一下Lisp、Smalltalk、javascript或Ruby,所有这些都大量使用匿名函数(正式名称为lambdas)。因为函数可以匿名定义,所以它们可以用作语法元素,而不是过程构造。这使得创建您自己的语言外观结构更加容易。这也是Ruby构建轻量级块的原因。
- @Lennart在ruby:gist.github.com/144883中查看了python装饰器的这个实现。我正在等待您在python中实现22个loc的Ruby元编程。
- @耶胡达:你似乎继续声称Python没有羊羔。你就是说不通。我一直在等待这样的论据:Ruby中的元编程对于Web框架是必要的。这并不是一个关于Ruby和Python在总体上有什么更好的问题。这就是为什么Ruby对于Rails类型的框架更好的问题。没有这样的论据。您似乎既不了解这种区别,也不知道在谈到Python时您在谈论什么。
- @Lennart:Web框架在用Ruby编写时更加优雅。怎么样?
- 很简单,他们不是。我已经花了好几个小时调查匿名关闭会带来更多优雅的要求,对不起,这是错误的。没有什么可以证实这一说法。多亏了这些帮助。stackoverflow.com/questions/1113611/&hellip;
- @在这一点上,你只是一遍又一遍地重复你的主观观点。这篇文章已经因为主观性而关闭了,如果你只是让你的主观性评论站在他们自己的立场上,停止重复它们,那么在这一点上它可能会有所帮助。
- 为什么这是一个在Ruby中如何使用块的好例子?为什么这不能成为一个案例陈述?gist.github.com/155906
- 我喜欢这样一个事实,即您不必在常规语法中使用"=>"、":"、"@"或"<"。这些特殊字符在设计良好的语言中仅用于特殊目的,如界定字典的键值对,或使用修饰符,或(相反)表示大于或等于或小于。让我简单地说:如果没有编程经验,您将无法看到Ruby并开始理解任何东西。
- @PJB3因为有了FORMAT,您就有机会执行默认操作(如FORMAT.html,不采取块),如果您期望一种您没有配置的格式(如FORMAT.foo,当您没有为"foo"配置mime类型时),则会出现错误。它使用Ruby的块来实现更多的逻辑,而不仅仅是简单的条件逻辑。
- Django代码比这里显示的要容易得多。
- 如前所述,Python中的lambda总是匿名的。然后,元编程导致混乱,反过来,更难调试,反过来,花费更多的时间。更不用说,它有效地阻止了解释器应用急需的优化(Ruby是Slooow!)
那些认为
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。
- 好吧,我们正在进入主观领域。如果你认为管理员是"唯一的",那么也许是因为你没有享受到它所带来的节省时间的好处。有没有你认为django比Rails做得更糟糕的地方,因为Ruby和Python没有这样的特性?关键并不在于哪个框架更好——而是(如本问题的其他地方所指出的)是否在python中有任何不足之处,这使得它不太能够开发出一流的框架。从证据上看,没有这样的缺乏。
- 营销就像"每个使用它的人都喜欢谈论他们有多喜欢它"?我会说,Django的市场营销至少和Rails一样好,只是它的存在时间不长。
- 我同意管理界面是一个很好的功能。它不是一个"唯一的",因为它不引人注目;它是一个"唯一的",因为它是唯一的。
- @马特·布里格斯:我同意Django的市场营销相当不错,但在你的脸上根本不像dhh;-)@chuck:我同意在其他方面更主观。看看我之前的元点,我的实际点是什么;-)
- @对于投反对票的人:我并不介意,但我很好奇为什么你认为我的回答没有帮助。我没有意识到有人投了反对票,因为有人不同意某人的立场——我通常投了反对票,只是在我觉得某个问题或答案不知何故使事情变得更糟的时候。
- 我可以编写自己的管理部分,我不需要在框架中这样做。我更喜欢其他使我的应用程序更容易编写的方法。
- @对你很好。我不喜欢为大多数系统需要的管理内务处理编写样板页面。最近,我为当地的一个慈善网站做了一些公益性的工作,如果django管理员不是其中一员的话,做这个网站根本不可行。事实上,我为最终用户提供了一个具有相当定制的AjaxifiedUI的站点,但是后端管理员与管理员合作,这已经足够满足他们的需求了。
- @维尼:你没有回答他的问题,你在评论。他的问题是"Ruby为什么适合Rails这样的平台?"不是"为什么Ruby比Python好?"或者"还有什么平台比Rails更好?"
- @马特:我认为我回答他的问题的方式是:(a)我对Rails成功的可能原因有什么看法;(b)Django的存在,至少在某些方面比Rails好,这表明Ruby并不一定比Python更适合在同一空间中开发框架。显然,在这种情况下,更需要一种主观的衡量,而不是客观的衡量。
- @马特:他的问题是为什么Ruby比python更合适。答案是,完全正确的,事实并非如此。
- @维尼:很抱歉我太学究/挑剔了,但是a)我会认为一个评论而不是一个答案,b)是完全没有意义的,因为问题不是一般的Web框架,而是Rails。再说一次,我不想让你失望,但我认为你获得20票的唯一原因是那些支持姜戈/憎恨铁路的人,而不是因为这是对这个问题的一个很好的回答。
- @伦纳特:他的问题是为什么Ruby比Python更适合用于Rails。答案并没有接近答案,它反驳了问题中先前的陈述,并插入了一个替代框架。
- @马特-我仔细阅读了这个问题。它表示"这样一个框架",我将其解释为"同一空间/同一类型的框架"。我不得不懊恼地笑着,因为我对这个答案的支持率太低了——但是,我不会因为选择框架而改变宗教信仰,它们只是帮助你完成工作的工具。
- @维尼:没必要陷入这些愚蠢的争论中。问题本身就是一个火饵。不要喂巨魔。
- 我想说,比起巨魔,更多的是范博伊。不管怎样,除非有什么有趣的事情发生,否则我不打算花更多的时间来做这个。
- 不值得为谁的语言更好而斗争。加入Ruby的人越多,对我(Python开发人员)就越好,因为随着Python社区变得越来越企业化(就像现在这样(看看Unladen Swallow)),而我在航空航天领域的收入达到了18万美元,Rubinian仍然会在同一个CMS和/或博客和/或社交网站上构建数百种细微的变化……免费。
python社区认为,以最简单、最直接的方式做事是优雅的最高形式。Ruby社区认为,以聪明的方式做事情,允许酷代码是最优雅的形式。
如果您遵循某些约定,那么Rails就是您的一切,其他事情的负载会神奇地发生在您身上。这与红宝石看待世界的方式非常吻合,但并没有真正遵循Python的方式。
- 当然,但是有很多Perl人(可能不是很多人)认为神秘的一行程序很酷,还有很多口齿不清的人发誓这是一种真正的语言。我们绝对是在你船上漂浮的地方。
- Rails没有魔力,它就在源代码中。如果你想知道怎么做的话,那就滚开去看看。
- "任何足够先进的技术都无法与魔法区分开来。"—阿瑟·C·克拉克
- "魔法"意味着框架可以为你做很多事情,而不需要你直接问。再说一次,我不是在做价值判断,它是一种做事情的方式,有好的一面和坏的一面。就个人而言,我认为它在Rails中的工作非常出色。
- "Ruby社区认为,以聪明的方式做事情,允许使用酷代码是优雅的最高形式。"—这是一种概括,我认为每种语言都有它属于"天才"的一部分。
- 优雅和习俗并不代表魔力。
- @BJ:根据你的个人资料,你是一个红宝石人,在这种情况下,你可以证明我说的是什么。Rails不会以人们所说的"Python式"方式做事。
- "即使你知道它是怎么做的,它仍然是神奇的。"——特里·普拉切特
- 不是"聪明的方法"和"酷代码"有价值,而是"有效的方法"和"简洁的代码"。
- 我想这取决于你认为聪明和酷的东西。
- 我认为这个答案概括了所有的问题。很明显,没有绝对最好的语言/框架。你应该按照你更喜欢的哲学去工作,感谢上帝有很多选择。当你想要交换方法和知识,而不是进行无意义的比较时,这些问题是有成效的。仅供参考:我在红宝石方面。=)
- 我一直认为Ruby哲学是"安排事情,所以做事情最简单的方法也是最好的方法"。在其他语言中,我发现为了"充分利用语言结构",我需要以一种更难阅读并且不能真正表达我的意思的方式混淆代码。在Ruby中,我很少需要这样做来生成有效的代码。
这场辩论是一场新的"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粘贴得很糟糕吗?
- 我花了好几个小时来修复别人的代码,这些代码是在别人不注意的情况下以这种方式被破坏的。Skype也特别糟糕——它会折叠领先的空白,我找不到关闭它的方法。至少,如果您缺少大括号或结尾,它将引发语法错误,或者您的文本编辑器将警告您,但机器无法知道您的缩进何时出错,但它仍然有效。
- 对我来说,我需要在Ruby中加入大量浪费空间的"ends",这比弥补缺乏模糊的"nice"特性要好得多。
- 在python中,空白不重要:secnetix.de/~olli/python/block_indentation.hawk。由于python中的缩进(您必须修改编辑器设置),几乎不可能引入"不可见的错误",当然,由于任何其他语言中的缩进,仅仅通过不正确的缩进,完全可能引入不可见的错误。@字段:那么不要通过Skype或HTML复制代码。哎呀!
- 如果您试图向字符串添加非字符串(如在联接中),Python会抱怨这是正确的。这是因为显式优于隐式。在Python中,自动转换很少,这是因为它们往往会导致问题,特别是在动态语言中,因为最终情况不是您期望的类型。当然".join()方法在开始时确实有倒退的感觉,但这就是原因。事实上这在名单上没有意义…
- @在弱类型语言的上下文中,"显式优于隐式"没有任何意义。如果您想要强类型,那么对您来说更强大(Python和Ruby都不是真正适合您的),但是弱类型语言的很多价值在于让解释器在有意义的地方为您做隐式转换。join的返回值是一个字符串,那么为什么不将所有内容转换为字符串呢?"那么,不要通过Skype或HTML复制代码。"—或者我只使用一种不会被我与分布式团队最常见的协作方式破坏的语言。
- 是的,但python是强类型的。
- python肯定不是强类型的,因为它不能在编译时检查类型冲突。如果没有这些,我想知道Python类型检查的真正好处是什么,特别是在Ruby坚持功能检查而不是严格的类型检查的情况下。如果可以将数字表示为字符串,那么谁真正关心它是否不是严格意义上的"字符串"类型呢?
- 全能的上帝…您的意思是静态类型,而不是强类型。python是强类型的,ruby:stackoverflow.com/questions/520228/&hellip;也不能向ruby中的整数添加字符串。我厌倦了纠正你,请在你将来回答之前核对一下你的事实。
- 谷歌搜索"python是强类型的"。相当一致
- @lennart"explicit比implicit好",只针对每行代码的可读性目标,即python目标。Ruby目标是简洁的,有了这个目标,隐式比显式更好。
- @阿尔帕夫:你提到那个目标了吗?因为我很难相信它,因为它会…好吧,我能想到的最好的词是"误导"。
- 关于python和ruby的目标:python的目标是规则性和可读性,而不是简洁性,ruby上的matz:使编程更快更容易
- 你就像我妻子。她总是说我们有很多问题。但是,当我问她什么样的问题时,她只记得最怨恨的一个,当我不想和她一起去购物时:)
- 使用map(str, numList)代替列表理解。另外,你可以去掉[和],换上一个发电机,情况会好得多。
真正的答案是,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努力方面做得很好。
- 事实上,这种"魔法"在Python中经常受到冷落;例如,code.djangoproject.com/wiki/removingthemagic
- 我认为为了"魔法"而使用的"魔法"(元编程技巧)应该总是不受欢迎的——更简单的代码,但同样强大和富有表现力的代码,应该总是会赢——但有些情况下,提供所需准确功能和语法的唯一方法需要"魔法"——在这些情况下,"魔法"是不可依赖的;)
两个答案:
因为Rails是为Ruby编写的。
B.出于同样的原因,C比Ruby更适合Linux
所有这些都是"imho"
在Ruby中,有一个Web应用程序框架,所以它是为该语言发布广告的唯一框架。
从一开始,python就有几个:zope、twisted、django、turbogears(它本身是其他框架组件的组合)、pylons(类似于rails框架的克隆)等等。它们中没有一个是"要使用的"Python社区范围的支持,所以所有的"groundswell"都分布在几个项目中。
由于Rails的存在,Rails拥有单独的社区规模,或者至少是绝大多数社区规模。
python和ruby都完全能够作为一个Web应用程序框架来完成这项工作。使用一个你(和你的潜在开发团队)喜欢的,并且可以与之保持一致。
- Ruby有多个Web应用程序框架:Nitro、Merb、Camping。举几个例子
- 附加:Sinatra,甚至是一个裸架应用程序,非常快速,非常少的网络应用程序,以及。
- -1"Ruby中有一个Web应用程序框架"太过分类…为了一个错误的陈述。Nitro、Merb、Camping、Sinatra
- 任何一方的不为人知的观点正是试图解决这一切的新来者困惑的原因。这也意味着,如果他们知道得更好,人们可能会错过一些他们会真正感激的事情。
- 我认为他的观点是Rails比Django对python社区有更大的关注度,这是有效的
- 为什么投票否决?Rails本身声称它们是Ruby的唯一框架。当然,还有其他的,但这不是Rails用户的心态。事实上,几年前有一个很流行的版本,它更基本、更简单,Rails将它们和它们自己合并在一起(不记得名字了)。