为什么Ruby比Python更适合Rails?
Python和Ruby通常被认为是很相似的语言(虽然它们的历史背景差别很大),在表达能力和功能上也很相近。不过,有人认为Rails这个框架的巨大成功,实际上和它所基于的语言——Ruby,有很大关系。那么,为什么Ruby更适合用来做这样的框架,而不是Python呢?
相关问题:
13 个回答
Python社区认为,最简单、最直接的做事方式就是最高级的优雅。而Ruby社区则认为,聪明的做法能让代码变得很酷,这才是最高级的优雅。
Rails的核心理念是,如果你遵循一些特定的规则,很多其他的事情就会自动为你完成。这种方式与Ruby的思维方式非常契合,但与Python的做事风格不太一致。
那些认为
Rails框架的巨大成功主要是因为它所使用的编程语言
的人,我觉得是错的。这个成功可能更多是因为聪明而持续的市场推广,而不是技术上的优势。Django在很多方面做得更好(比如内置的超级强大的管理界面),而不需要Ruby的任何特性。我并不是在贬低Ruby,只是在为Python辩护!
这里主要有两个大的区别:
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中,闭包是存在的,但必须给它们起个名字才能使用。所以在Python中,你不能像在Ruby里那样自由地使用闭包,而是得明确地说明你在用一个闭包。
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方法也可以接受一个字符串,这样在创建类的过程中,就可以动态地创建方法,而这些方法的行为可以根据传入的参数而不同。
实际上,在Python(以及其他语言)中也可以做到这种元编程,但Ruby更有优势,因为元编程在Ruby中并不是一种特殊的编程风格。Ruby的一切都是对象,所有代码行都是直接执行的。因此,Class本身也是对象,类的主体有一个指向类的self,你可以在创建类的同时调用类的方法。
这在很大程度上决定了Rails中声明性编程的程度,以及我们能够轻松实现看起来像关键字或新代码块语言特性的新声明性功能。