Python と Ruby は通常、似たような表現力とパワーを備えた (歴史的な荷物はかなり異なりますが) 近い親戚であると考えられています。しかし、Rails フレームワークの大きな成功は、それが構築されている言語、つまり Ruby 自体に大きく関係していると主張する人もいます。では、Ruby が Python よりもそのようなフレームワークに適しているのはなぜでしょうか?
13 に答える
おそらく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で可能な宣言型の程度と、キーワードや新しいブロック言語機能のように見える新しい宣言型機能を簡単に実装できることに大きく関与しています。
と主張した人たち
Rails フレームワークの大きな成功は、それが構築されている言語に大きく関係しています。
(IMO)間違っています。この成功は、技術的な優れた能力よりも、巧妙で持続的なマーケティングに負っている可能性があります。Djangoは、Ruby の機能をまったく必要とせずに、多くの分野 (組み込みのキックアス管理者など) でより優れた仕事をすることはほぼ間違いありません。Ruby を否定しているわけではありません。Python を支持しているだけです。
Python コミュニティは、物事を可能な限り単純かつ単純な方法で行うことが、エレガンスの最高の形であると信じています。ruby コミュニティは、クールなコードを可能にする巧妙な方法で物事を行うことが、エレガンスの最高の形であると信じています。
Rails は、特定の規則に従えば、他の多くのことが魔法のように起こります。これは、世界を見るルビーの方法とは非常によく一致しますが、実際には Python の方法には従いません。
この議論は新しい「vim対emacs」の議論ですか?
私はPython/Djangoプログラマーですが、これまでのところ、Ruby/Railsに切り替えるような問題をその言語/フレームワークで見つけたことはありません。
Ruby/Railsを使った経験があれば同じだろうと想像できます。
どちらも同様の哲学を持っており、迅速かつエレガントな方法で仕事をします。より良い選択はあなたがすでに知っていることです。
個人的には、「一貫した表現力」と呼ぶものを構成する多くの点で、Ruby は Python よりも優れていると思います。たとえば、Ruby では、join は文字列を出力する配列オブジェクトのメソッドなので、次のようになります。
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'
時間の経過とともに加算される、これらの小さな種類の違いがたくさんあります。
また、目に見えない論理エラーを導入するには、空白を意味のあるものにする以外に良い方法は思いつきません。
本当の答えは、 Python も Ruby も Web フレームワークの候補として優れている/劣っているということではありません。客観性が必要な場合は、両方にコードを記述し、コミュニティを含め、どちらが個人的な好みに最も適しているかを確認する必要があります.
どちらか一方を主張するほとんどの人は、もう一方の言語を真剣に使用したことがないか、個人的な好みに「投票」しています。
ほとんどの人は、新しいこと (MVC、テスト、ジェネレーターなど) を教えたり、より良いこと (プラグイン、テンプレートなど) を行ったりするため、最初に接触するものに落ち着くと思います。以前は PHP で開発しており、RubyOnRails に触れるようになりました。Rails を見つける前に MVC について知っていたら、PHP を置き去りにすることはなかったでしょう。しかし、Ruby を使い始めると、構文や機能などを楽しむことができました。
Python とその MVC フレームワークの 1 つを最初に見つけていたら、代わりにその言語を賞賛していたでしょう!
Python には、Rails に似たフレームワークが多数あります。PyCon での典型的な講演中に、少なくとも 1 つの Web フレームワークが明らかになるというジョークが出るほどたくさんあります。
Ruby のメタ プログラミングがより適しているという議論は、IMO では正しくありません。このようなフレームワークにはメタプログラミングは必要ありません。
したがって、この点で Ruby は Python より優れているわけではなく (おそらく悪くもない) と結論付けることができると思います。
Rails は Ruby の機能セットを利用するように開発されているためです。
同様に無意味な質問は、「Python は Ruby よりも Django に適しているのはなぜですか?」です。
言語の特徴そのものについて議論するのではなく、それぞれのコミュニティが言語の特徴に与えるアクセントについて議論すべきだと思います。たとえば、Python では、クラスを再度開くことは完全に可能ですが、一般的ではありません。しかし、Ruby では、クラスを再度開くことは日常的なことです。これにより、フレームワークを現在の要件に合わせて迅速かつ簡単にカスタマイズでき、Ruby は他のどの動的言語よりも Rails のようなフレームワークに適したものになります。したがって、私の答えは、再開クラスの一般的な使用です。
構文はよりきれいになり、Ruby は、少なくとも私にとっては、はるかに「楽しい」ものになったと思います。
ActiveRecord (Rails の主要コンポーネント) を可能にするために必要なメタプログラミングの種類は、Python よりも Ruby の方が簡単で自然であると言う人もいますが、私はまだ Python を知りません;) ので、私はこの声明を個人的に確認することはできません.
私はレールを簡単に使用しましたが、キャッチオール/インターセプターと動的評価/コードインジェクションを使用すると、他のフレームワークの一部よりもはるかに高いレベルの抽象化で操作できます (その前に)。私は Python のフレームワークの経験がほとんどないかまったくありませんが、Python コミュニティは Python の取り組みをサポートし、促進する素晴らしい仕事をしていると聞いています。
2つの答え:
を。RailsはRuby用に書かれているからです。
b. 同じ理由で C は Ruby よりも Linux に適しています
これはすべて完全に「私見」です
Ruby には 1 つの Web アプリケーション フレームワークがあるため、その言語用に宣伝されている唯一のフレームワークです。
Python には当初からいくつかの機能がありましたが、ほんの少し例を挙げると、Zope、Twisted、Django、TurboGears (それ自体が他のフレームワーク コンポーネントの組み合わせ)、Pylons (Rails フレームワークのちょっとしたクローン) などです。それらのどれも「使用するもの」として Python コミュニティ全体でサポートされていないため、すべての「グラウンドスウェル」は複数のプロジェクトに分散しています。
Rails は、Rails のおかげで、単独で、または少なくとも大多数のコミュニティの規模を持っています。
Python と Ruby はどちらも、Web アプリケーション フレームワークとしての仕事を完全に行うことができます。あなた (および潜在的な開発チーム) が好み、連携できるものを使用してください。