Vic*_*Yan 90 ruby python ruby-on-rails web-frameworks
Python和Ruby通常被认为是具有相似表现力和力量的近亲(虽然具有完全不同的历史包袱).但有些人认为Rails框架的巨大成功确实与它所构建的语言有很大关系:Ruby本身.那么为什么Ruby比Python更适合这样的框架呢?
Yeh*_*atz 170
可能存在两个主要差异:
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
Run Code Online (Sandbox Code Playgroud)
匿名闭包/ lambdas可以更容易地模拟需要块的新语言功能.在Python中,存在闭包,但必须对它们进行命名才能使用.因此,您不必使用闭包来模拟新的语言功能,而是强制要明确表示您正在使用闭包这一事实.
这在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
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,您都可以这样做:
Bar.new.hello
Run Code Online (Sandbox Code Playgroud)
这将打印"你好".该class_eval方法还采用String,因此可以在创建类时动态创建方法,这些方法基于传入的参数具有不同的语义.
事实上,可以在Python(以及其他语言)中进行这种元编程,但Ruby有一个优势,因为元编程不是一种特殊的编程风格.它源于这样一个事实:在Ruby中,一切都是对象,所有代码行都是直接执行的.因此,Classes本身就是对象,类主体self指向Class,您可以在创建类时调用类的方法.
这在很大程度上负责Rails中可能的声明性程度,以及我们能够轻松实现看起来像关键字或新的块语言功能的新声明性功能.
Vin*_*jip 58
那些争论的人
Rails框架的巨大成功确实与它所构建的语言有很大关系
是(IMO)错了.这种成功可能更多地归功于聪明和持续的营销,而不是任何技术实力.Django可以在许多方面做得更好(例如内置的kick-ass管理员),而不需要Ruby的任何功能.我根本不是在嘲笑Ruby,只是站在Python上!
Mat*_*ggs 54
蟒蛇社区认为,以最简单,最直接的方式做事是最高雅的形式.红宝石社区认为,以巧妙的方式做事,允许酷代码是最优雅的形式.
如果你遵循某些惯例,那么Rails就是关于它的,其他一些东西会神奇地发生在你身上.用红宝石的方式看世界真的很好,但并没有真正遵循python的方式.
luc*_*luc 26
这场辩论是否是一场新的"vim与emacs"辩论?
我是一名Python/Django程序员,到目前为止,我从未在该语言/框架中发现过导致我切换到Ruby/Rails的问题.
我可以想象,如果我对Ruby/Rails有经验,那就相同了.
两者都有相似的理念,并以快速和优雅的方式完成工作.更好的选择是你已经知道的.
fie*_*lds 25
就个人而言,我发现红宝石在很多方面都优于蟒蛇,这些方式构成了我称之为"一致的表现力".例如,在ruby中,join是一个输出字符串的数组对象的方法,所以你得到这样的东西:
numlist = [1,2,3,4]
#=> [1, 2, 3, 4]
numlist.join(',')
#=> "1,2,3,4"
Run Code Online (Sandbox Code Playgroud)
在python中,join是字符串对象上的一个方法,但是如果你将一个字符串以外的东西作为要连接的东西传递它会引发错误,所以相同的构造是这样的:
numlist = [1,2,3,4]
numlist
#=> [1, 2, 3, 4]
",".join([str(i) for i in numlist])
#=> '1,2,3,4'
Run Code Online (Sandbox Code Playgroud)
随着时间的推移,这些微不足道的差异很多.
此外,我想不出一种更好的方法来引入不可见的逻辑错误,而不是使空白显着.
Kri*_*ris 15
真正的答案是既不 Python或Ruby是一个Web框架更好/更糟糕的候选人.如果你想要客观性,你需要在两者中写一些代码,看看哪个最适合你的个人偏好,包括社区.
争论一个或者其他人的大多数人都没有认真地使用过其他语言,或者为了个人喜好而"投票".
我猜大多数人都会决定先与他们联系,因为它教会了他们新的东西(MVC,测试,生成器等)或做了更好的事情(插件,模板等).我曾经用PHP开发并且与RubyOnRails联系.如果在找到Rails之前我已经了解过MVC,我很可能永远不会让PHP落后.但是一旦我开始使用Ruby,我就会喜欢它的语法,功能等.
如果我首先找到了Python和它的一个MVC框架,那么我很可能会赞美这种语言!
Len*_*bro 11
Python有很多类似Rails的框架.有太多笑话,在PyCon的典型谈话中,至少有一个Web框架会看到光明.
Rubys元编程使其更适合的论点是IMO不正确.你不需要像这样的框架进行元编程.
所以我认为我们可以得出结论,Ruby在这方面并不比Python更好(也可能更糟).
有人说,使 ActiveRecord(rails 的关键组件)成为可能所需的元编程类型在 ruby 中比在 python 中更容易、更自然 - 我还不了解 python;),所以我个人无法证实这一说法。
我简单地使用过 Rails,它对包罗万象/拦截器和动态评估/代码注入的使用确实允许您比其他一些框架(在它出现之前)更高的抽象级别上进行操作。我对 Python 框架几乎没有经验 - 但我听说它同样有能力 - 并且 Python 社区在支持和促进 Python 化的努力方面做得很好。