RubyがPythonよりRailsに適しているのはなぜですか?[閉まっている]


90

PythonとRubyは通常、似た表現力とパワーを持つ近い従兄弟であると考えられます(ただし、歴史的な手荷物はかなり異なります)。しかし、Railsフレームワークの計り知れない成功は、Ruby自体がその基盤とする言語と本当に関係があると主張する人もいます。では、RubyがPythonよりもそのようなフレームワークに適しているのはなぜでしょうか。


44
頭韻。_
ジミー

75
「バケツのPythonは」ただ...それまでと同じ感覚を持っていない
ephemient

105
@エフェミエント:Python on Planesになると思います。
ジミー

37
@ジミー:誰が飛行機を必要としますか?反重力をインポートする;-) xkcd.com/353
Vinay Sajip 2009

157
刑務所にJavaはありますか?
Nosredna 2009

回答:


170

おそらく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はそれ自体がオブジェクトであり、クラス本体はselfClassを指しているので、クラスを作成しながらクラスのメソッドを呼び出すことができます。

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


40
Pythonでは、すべてがオブジェクトであり、コードのすべての行も直接実行されます。;)しかし、クラス本体のクラスを指す「自己」はなく、クラス定義の後でないと作成されないため、そのコードを後でPythonに配置する必要があります。 、ただし機能的には同等です。
Lennart Regebro、2009

31
@lennartそれは一種のポイントです。Pythonでは、名前付きラムダ、デコレータ、クラスの作成後にコードを配置することで同じ種類のことを行うことができますが、エレガンスの喪失はすぐに増大し、Railsのようなものは実装が著しく困難になるか、エンドユーザーにとって著しくエレガントでなくなります。
イェフダカッツ

9
彼らは本当に私にとって大きな違いのようには見えません。
ディートリッヒエップ

10
@lennart私は少し混乱しています。私はあなたがPythonではそれらを必要としなかったと言いました-しかしそれらを持たないことはコードを実装することを難しくしたり、エンドユーザー(どちらか一方)のためのエレガントさを低下させました。言語は完全に整いつつあります。必要に応じてCでRailsを作成できます。
イェフダカッツ

5
@lennartこれで主観的な領域に入りましたが、私が話した2つの機能は、宣言型プログラミングと手続き型プログラミングが混在するフレームワークを作成するときに非常に便利です。特に、匿名のラムダの欠如は、Pythonの表現制限です。一貫性の欠如(クラスが作成された後でのみ、作成されたクラスを処理する必要性)もかなり制限されています。
イェフダカッツ

58

と主張した者たち

Railsフレームワークの計り知れない成功は、それが構築されている言語と本当に関係があります

(IMO)が間違っています。その成功はおそらく、技術力よりも巧妙で持続的なマーケティングのおかげです。Djangoは、Rubyの機能を必要とせずに、多くの分野(組み込みのキックアス管理者など)で間違いなくより良い仕事をします。私はRubyをまったく嫌うのではなく、Pythonに立ち向かうだけです!


10
さて、私たちはここで主観的な領域に入っています。管理者が「唯一」であると考える場合、それはおそらく、それが与える時間節約のメリットを享受していないためです。Rubyの機能とPythonの機能がないために、DjangoがRailsよりも悪いと思う領域はありますか?重要なのは、どのフレームワークが優れているかということではありません-(この質問の他の場所で指摘されているように)Pythonに欠けているものがあるかどうかによって、キックアスフレームワークの開発能力が低下します。証拠として、そのような不足はありません。
Vinay Sajip、2009

18
@投票者へ:私は本当に気にしませんが、私の回答が役に立たないと思った理由を知りたいと思います。ある人が誰かの立場に同意しなかったため、私は1つの反対投票に気づきませんでした。
Vinay Sajip、2009

5
私は自分の管理セクションを書くことができます、これはフレームワークにある必要はありません。アプリケーションを簡単に作成できる他の方法を好みます。
nitecoder、2009

8
@railsninja:いいね ほとんどのシステムで必要な管理ハウスキーピングの雑用のために、ボイラープレートページを作成する必要はありません。最近、私は地元の慈善団体のウェブサイトで無料の仕事をしましたが、Django管理者が方程式の一部にならなかったら、そのサイトを作ることはまったく不可能でした。確かに、私はエンドユーザー向けにかなりカスタマイズされたAjax化されたUIをサイトに提供しましたが、バックエンド管理者は管理者と協力して作業しましたが、それは彼らのニーズに対して十分以上でした。
Vinay Sajip 2009

6
@マット:彼の質問は、なぜRubyがPythonよりも適しているのかということです。そして、答えは、正確にはそうではないということです。
Lennart Regebro 2009

54

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

Railsはすべて、特定の規則に従うと、魔法のように他の多くのことが起こります。これは、ルビの世界の見方には非常によく対応していますが、Pythonの方法にはあまり従っていません。


4
確かに、しかし、Perlの(まあ、そうでないかもしれない人々の喪失があるたくさんの不可解なワンライナーはクール、そしてそれが唯一の真の言語だと誓う多くのLispの人だと思います)。私たちは間違いなく、あなたのボートに浮かぶものの領土にいます。
Vinay Sajip 2009

4
Railsには魔法はありません。ソースの中にあります。方法を知りたい場合は、お尻から降りて調べてください。
nitecoder、2009

21
「十分に進歩した技術はどれも魔法と区別がつかない。」-アーサーC.クラーク
Vinay Sajip 2009

1
「マジック」とは、フレームワークが直接尋ねられることなく、たくさんのことをあなたに代わって行うことを意味します。繰り返しますが、私は価値判断をしていません。それは、良い面と悪い面を持つことを行う1つのスタイルです。個人的には、レールでうまく機能すると思います。
マットブリッグス

2
優雅さと慣習は魔法を表すものではありません。
BJクラーク

26

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

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

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

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


25

個人的には、ルビは私が「一貫した表現力」と呼ぶものを構成する多くの点で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'

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

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


29
私の経験では、空白を大きくすることで、論理エラーをなくすことができます。間隔と構文が一致しないと、はるかに混乱します。
Nosredna 2009

5
beginとendのある言語、および中括弧とアセンブリのある言語では、コードが誤って貼り付けられ、後で問題が発生するのを見てきました。それは常に問題です。Pythonをうまく貼り付けていない人とのトラブルはありましたか?
Nosredna 2009

5
Pythonでは空白は重要ではありません:secnetix.de/~olli/Python/block_indentation.hawk。Pythonのインデントが原因で「目に見えないエラー」を引き起こすことはほとんど不可能です(エディターの設定を変更する必要があります)。@fields:したがって、スカイプやHTMLを介してコードをコピーしないでください。もう。
Lennart Regebro 2009

7
Joinのように非文字列を文字列に追加しようとすると、Pythonが文句を言うのは正しいことです。これは、暗黙的よりも明示的の方が優れているためです。Pythonの自動変換はほとんどありません。その理由は、特に動的言語では問題が発生する傾向があるためです。確かに "" .join()メソッドは最初は逆に感じますが、それが理由です。それは実際にリストで意味をなさない...
Lennart Regebro 2009

8
全能の神...あなたは静的に型付けされたものであり、強く型付けされたものではありません。Pythonは強く型付けされており、Rubyもそうです。stackoverflow.com/ questions / 520228 / Rubyでは 、文字列を整数に追加することもできません。私はあなたを訂正するのに飽きてきました。将来答える前に、事実を確認してください。
Lennart Regebro 2009

15

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

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

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

もし私が最初にPythonとそのMVCフレームワークの1つを見つけていたら、代わりにその言語を賞賛するでしょう。


11

PythonにはRailsに似たフレームワークが多数ホストされています。PyConでの一般的な講演中に、少なくとも1つのWebフレームワークが光を見るほどの冗談がたくさんあります。

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

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


8

RailsはRubyの機能セットを利用するように開発されているためです。

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


4

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


1

一部の人は、ActiveRecord(レールの主要コンポーネント)を可能にするために必要なメタプログラミングのタイプは、PythonよりもRubyで実行する方が簡単で自然であると言っています。そのため、私は個人的にはこのステートメントを確認できません。

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


3
確かに、この種の「魔法」はPythonではしばしば嫌われます。たとえば、code.djangoproject.com
wiki

2
「マジック」のための「マジック」(メタプログラミングのトリック)は常に不快に思われるべきだと思います-単純なコードですが、同等に強力で表現力があり、常に勝つはずです-しかし、正確な機能と構文を提供する唯一の方法がある場合があります。あなたが望むのは「魔法」を必要とする-そしてそのような場合、「魔法」は不可欠である;)
ファイサルヴァリ


-1

2つの答え:

a。Railsはルビーのために書かれたからです。

b。同じ理由で、CはRubyよりもLinuxに適しています


質問のコンテキストを考えると、答えはまったく意味がありません。
lorefnon 2012

-6

このすべてが完全に「私見」です

Rubyには1つのWebアプリケーションフレームワークがあるため、その言語用に宣伝されているのはそれだけです。

Pythonは当初からいくつかありますが、Zope、Twisted、Django、TurboGears(それ自体は他のフレームワークコンポーネントの混合)、Pylons(Railsフレームワークの一種のクローン)などです。それらはどれもpython-community-wideで「THE one to use」としてサポートされていないため、すべての「groundswell」は複数のプロジェクトに広がっています。

Railsのコミュニティサイズは、Railsのおかげで、単独で、または少なくとも大部分が占めています。

PythonとRubyはどちらも、Webアプリケーションフレームワークとして完全に機能します。YOU(およびあなたの潜在的な開発チーム)を好きなように使ってください。


7
ルビーは、複数のWebアプリケーションフレームワークを持っている:ニトロ、Merbの、キャンプ...少数を示すために
Corbanブルック

5
追加:Sinatraとベアラックアプリでさえ、非常に高速で非常に最小限のWebアプリです。
クリス

2
-1「Rubyには1つのWebアプリケーションフレームワークがあります」あまりにもカテゴリー的です... ニトロ、マーブ、キャンピング、シナトラ
Maximiliano Guzman

2
どちらの側からも情報のない意見は、これをすべて整理しようとしている新参者にとって混乱の原因です。それはまた、彼らがよりよく知っていれば、実際に感謝するものを見逃している可能性があることも意味します。
ウォルトジョーンズ、

3
私は彼のポイントは、RailsがDjangoは有効であるPythonコミュニティの持っているよりも、Rubyコミュニティの大きなマインドシェアを持っているということだったと思う
pjb3
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.