web-dev-qa-db-ja.com

RubyがPythonよりもRailsに適しているのはなぜですか?

PythonとRubyは、通常、似た表現力とパワーを備えた(かなり異なる歴史的な手荷物を持っていますが)親しいいとこと見なされます。しかし、Railsフレームワークの計り知れない成功は、実際にそれが構築されている言語であるRuby自体と大きな関係があると主張する人もいます。では、なぜRubyがPythonよりもそのようなフレームワークに適しているのでしょうか。

90
Victor Yan

おそらく2つの大きな違いがあります。

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

匿名のクロージャー/ラムダを使用すると、ブロックを取る新しい言語機能を簡単にエミュレートできます。 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  

「HELLO」と印刷されます。 class_evalメソッドは文字列も受け取るため、クラスが作成されるときに、渡されたパラメーターに基づいて異なるセマンティクスを持つメソッドをその場で作成できます。

実際、この種のメタプログラミングはPython(および他の言語も))で行うことができますが、Rubyはメタプログラミングが足りないため、これは特別なプログラミングスタイルではありません。Rubyではすべてがオブジェクトであり、コードのすべての行が直接実行されるという事実から流れています。結果として、Classesはそれ自体がオブジェクトであり、クラス本体はselfはクラスを指しており、クラスを作成しながらクラスのメソッドを呼び出すことができます。

これは、Railsで可能な宣言性の程度と、キーワードや新しいブロック言語機能のように見える新しい宣言機能を簡単に実装できる責任の大部分を担っています。

170
Yehuda Katz

と主張した者たち

Railsフレームワークの莫大な成功は、それが構築されている言語と実際に大きな関係があります

(IMO)が間違っています。その成功はおそらく、技術力よりも巧妙で持続的なマーケティングに負うところが大きいでしょう。 Django おそらく、Rubyの機能を必要とせずに、多くの領域(組み込みのキックアス管理者など)でより良い仕事をします。私はRubyを捨てるつもりはありません、Pythonのために立ち上がっているだけです!

58
Vinay Sajip

pythonコミュニティは、可能な限り最もシンプルで簡単な方法で物事を行うことがエレガンスの最高の形であると信じています。Rubyコミュニティは、物事を巧妙に行うことを信じていますクールなコードを可能にすることは、エレガンスの最高の形です。

Railsは、特定の規則に従うと、他の多くのことが魔法のように起こります。これは、Rubyの世界の見方でうまくいきますが、実際にはpythonの方法に従っていません。

54
Matt Briggs

これは新しい「vim対emacs」の議論ですか?

私はPython/Djangoプログラマーですが、これまでのところ、その言語/フレームワークでRuby/Railsに切り替える問題を発見したことはありません。

Ruby/Railsの経験があったとしても同じだと思います。

どちらも同様の哲学を持ち、速くてエレガントな方法で仕事をします。より良い選択は、あなたがすでに知っていることです。

26
luc

個人的には、Rubyがpythonより優れていると私は「一貫性のある表現力」と呼んでいるものを構成しています。たとえば、Rubyでは、文字列を出力する配列オブジェクトのメソッドなので、次のようになります。

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'

時間の経過とともに、これらの小さな種類の違いがたくさんあります。

また、目に見えない論理エラーを導入するより良い方法を考えて、空白を大きくすることはできません。

25
fields

本当の答えはどちらでもない PythonまたはRubyはWebフレームワークの良い/悪い候補です。客観性が必要な場合は、両方にコードを記述し、コミュニティを含め、どれがあなたの個人的な好みに最適かを確認してください。

どちらか一方を主張するほとんどの人は、もう一方の言語を真剣に使用したことがないか、個人的な好みに「投票」しています。

ほとんどの人は、何か新しいこと(MVC、テスト、ジェネレーターなど)を教えたり、何かより良いこと(プラグイン、テンプレートなど)を教えたりするので、どちらに最初に接触しても問題はないでしょう。以前はPHP=で開発していて、RubyOnRailsと連絡を取りました。MVCについて知っていて、Railsを見つける前に知っていたら、 PHP遅れています。しかし、私がRubyを使い始めると、構文、機能などを楽しんだことがありました。

私がPythonとそのMVCフレームワークの1つを最初に見つけた場合、代わりにその言語を賞賛する可能性が高いでしょう!

15
Kris

Pythonには、Hosts of Railsのようなフレームワーク全体があります。 PyConでの一般的な講演中に、少なくとも1つのWebフレームワークが光を見るほどの冗談がたくさんあります。

Rubyメタプログラミングが適しているという主張は、IMOが正しくないことです。このようなフレームワークのメタプログラミングは必要ありません。

したがって、Rubyは、この点でPythonよりも優れていない(そしておそらくどちらも悪い)ではないと結論付けることができると思います。

11
Lennart Regebro

なぜなら、RailsはRubyの機能セットを利用するために開発されたからです。

同様に無意味な質問は、「なぜPythonよりもDjangoのほうがRubyの方が適しているのか」というものです。

8
Paddy3118

言語機能については議論しないでくださいそれ自体ではなく、それぞれのコミュニティが言語機能に与えるアクセント。たとえば、Pythonでは、クラスを再度開くことは完全に可能ですが、一般的ではありません。ただし、Rubyでは、クラスを再開することは日常業務の一部です。これにより、現在の要件に合わせてフレームワークをすばやく簡単にカスタマイズできるようになり、他の動的言語よりもRuby Railsのようなフレームワークに適しています。クラス。

4
Giorgi

構文はよりクリーンで、Rubyは少なくとも私にとっては、「主に」もっと主観的になっていると思います。

1
James Schorr

ActiveRecord(Railsの主要なコンポーネント)を可能にするために必要なメタプログラミングのタイプは、Rubyよりpythonよりも-わからないpythonまだ;)なので、このステートメントを個人的に確認することはできません。

私はRailsを簡単に使用しました。キャッチオール/インターセプターと動的評価/コードインジェクションを使用すると、他の一部のフレームワークよりもはるかに高い抽象化レベルで操作できます(その前は) )Pythonのフレームワークの経験はほとんどありませんが、同等の能力があると聞きましたが、pythonコミュニティはPythonicの取り組みをサポートおよび育成するのに優れた仕事をしています。

1
Faisal Vali