为什么Ruby比Python更适合Rails?

2024-06-06 23:58:28 发布

您现在位置:Python中文网/ 问答频道 /正文

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


Tags: 框架语言关系历史railsruby力量表现力
3条回答

那些认为

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的任何特性。我一点也不反对Ruby,只是支持Python!

python社区认为,以最简单、最直接的方式做事是优雅的最高形式。ruby社区认为,用聪明的方式做一些事情,让代码变得酷,是优雅的最高形式。

如果您遵循某些约定,那么Rails就是您的全部内容,大量的其他事情会神奇地发生在您身上。这与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

匿名闭包/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方法也接受一个字符串,因此在创建类时,可以动态创建基于传入参数具有不同语义的方法。

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

这在很大程度上决定了Rails中可能的声明性程度,以及我们实现新的声明性特性(看起来像关键字或新的块语言特性)的容易程度。

相关问题 更多 >