RubyとPythonは解釈的にも動的型付け的にも素晴らしいプログラミング言語だ。その用途や人気、コミュニティについては、このブログのエントリーのひとつで読むことができる。これらの言語には多くの共通点がありますが、多くの相違点もあります。今回はそのいくつかを紹介しよう。
類似点
これらの言語が動的型付きインタプリタ言語という同じカテゴリーに含まれる以上、類似していることは間違いない。
ダイナミック・タイピング
両方 Python とRubyは動的型付け言語である。そのため、プログラマーは変数の型を指定しながら コード.変数の型はプログラムの実行中に決定され、変更されることもある。変数の型は、変数に格納されている値から導かれる。以下のコードはこれらの言語で正しく実行される:
変数= 1変数+= 2.5変数= 'サンプル文字列'変数= [2, 3.5, 'サンプル文字列']変数= [2, 3.5, 'サンプル文字列'
純粋構文
これは、とりわけ上記の点と関連している。型を宣言したり、ステートメントをセミコロンで終わらせたりする必要がなく、またスクリプト言語であるため、書くのも読むのも簡単である。よく書かれたコードは、これらの言語に触れたことのない人でも読むことができる。
対話型のコンソール・インタープリターがある
簡単な操作やコードの一部をテストしたいとき、ファイルを作成して特別なコマンドを使ってコードを実行する必要はありません。RubyにもPythonにも対話的なコンソールインタプリタ(REPL)がある。Pythonの場合、このようなインタプリタを次のコマンドで実行できます。 パイソン
(またはパイソン3
)、Rubyの場合は例えばこうなる、 irb:
$ irb2.5.8 :001 >結果= 2 + 1
=> 3
2.5.8 :002 >結果+= 3.5
=> 6.5
相違点
これらは異なるものである。 プログラミング言語もちろん、両者には違いがあるに違いない。Pythonとルビーの場合、その違いは数多くある。その中でも特に重要なものをいくつか紹介しよう。
インデント
Pythonではインデントが非常に重要です。すべてのコードブロックはインデントによって定義されます。与えられたブロックの各行が同じインデントであることが重要です。そうでないと、コードを実行しようとしたときにIndentationErrorが発生します。Rubyでは異なるアプローチを取る。ここでは、コードブロックはキーワードによって制限される。冒頭の単語(たとえばbegin、if、class、def
と語尾に 終了。
コードブロック内でコードがどのようにインデントされているかは問題ではない。
継承
オブジェクト指向プログラミングの基本機能のひとつ。正しい使い方をすれば、驚異的な働きをする。Pythonはマルチベース継承をサポートしている:
example.pyclass ClassA:def callA(self):
print('callA')クラス ClassB:def callB(self):
print('callB')クラスClassAB(ClassA,ClassB):
パス
class_inst=ClassAB()class_inst.callA()class_inst.callB()
その結果、こうなる:
$ python3 example.py
callA
callB
Rubyはデフォルトでは<演算子を使った単一ベース継承しかサポートしていない。しかし、モジュールを使って多塩基継承をシミュレートすることは可能です:
example.rbclass ClassA
def callaputs'calla'終了
終わり
モジュール ModuleBdef callbputs'callb'終了
終了
クラスClassAB<クラスClassAincludeModuleB
終了
classinst= ClassAB.newclassinst.calla
classinst.call_b
何が我々に与えてくれるのか:
$ ruby example.rb
call_a
call_b
含む
はRubyで利用可能なミキシンのひとつに過ぎない。ミキシンはクラスに追加機能を持たせるためのものです。Rubyには3つのミキシンがある。
含む
私たちが 含む
をクラス定義に使うと、含まれるモジュールはこのクラスの直接の祖先になります。これは、モジュールのすべてのメソッドがこのクラスのインスタンス・メソッドになることを意味します。クラスでそれらをオーバーライドしたり、(モジュールで定義された)オリジナルのメソッドを スーパー
というキーワードがある。
example.rb
モジュール ModuleAdef print_somethingputs'モジュールからのメッセージ'
end終わり
クラス ClassB
インクルード ModuleAdef print_somethingputs'クラスからのメッセージ'スーパーend終了ClassB.new.print_something
結果
$ ruby example.rb
クラスからのメッセージ
モジュールからのメッセージ
プリペンド
ほとんど同じように機能する 含む
しかし、前置されたモジュールはクラスの直接の子孫になります。つまり、クラスでモジュールのメソッドをオーバーライドすることはできませんが、モジュールのメソッドはスーパー
というキーワードがある。
example.rb
モジュール ModuleAdef print_somethingputs'モジュールからのメッセージ'スーパーend終了
クラス ClassB
ModuleA を追加するdef print_somethingputs'クラスからのメッセージ'
end終わりClassB.new.print_something
結果
$ ruby example.rb
モジュールからのメッセージ
クラスからのメッセージ
エクステンド
モジュールで定義されたメソッドがクラスのクラス・メソッドになることを除けば、includeと似た働きをする。
結果
$ ruby example.rb モジュールからのメッセージ
機能とブロック
Pythonには関数がある。Rubyはメソッドしかサポートしていない。それは何を意味するのか?とりわけ、Pythonは関数を変数に保持し、それを別の関数の引数として渡すことができる。Rubyでは、そんな簡単なことはできない。これも括弧が関係している。Pythonで引数のない関数、あるいはデフォルトの引数を持つ関数があった場合、その名前を括弧なしで使うと、その関数が返されます。括弧を付けるだけで関数が実行されます。Rubyでは、括弧なしで関数を呼び出すことができます:
example.pydef inner_function():
print('内部関数')
def wrapper_function(function):
print('ラッパー関数')
function() wrapperfunction(innerfunction)
結果
$ python3 example.py
ラッパー関数
内部関数
ルビーで:
example.rbdef inner_functionputs'内部関数'終了def wrapper_function(function)puts'ラッパー関数'関数
終了
wrapperfunction(innerfunction)
結果
$ ruby example.rb
内部関数
ラッパー関数
もちろん、この場合はRubyでいくつかのトリックを使えば、望みの効果を得ることができる。まず、Procオブジェクトを使う:
example.rbdef inner_functionputs'内部関数'終了def wrapper_function(function)puts'ラッパー関数'function.call
終了
func= Proc.new {innerfunction}.wrapperfunction(func)
結果
$ ruby example.rb
ラッパー関数
内部関数
つ目のアプローチは、ブロックを使うことだ:
example.rbdef inner_function
puts'内部関数'終了def wrapper_functionputs'ラッパー関数'
yield終了
wrapperfunctiondoinnerfunction
終了
結果
$ ruby example.rb
ラッパー関数
内部関数
リスト理解
これは非常に便利なPythonの機能である。これは、別のリストを基にリストを作成する機能である。数字のリストが与えられたら、奇数の2乗のリストを作る。Pythonではリスト内包を使う:
numbers= [1, 3, 4, 7, 8, 12, 15].result= [num*numfornuminnumbersifnum% 2].
利点は、メモリ上に2つのリストしかないことだ。
Rubyでは少し事情が異なる。この課題を解決する方法はいくつかある。その中で最も読みやすいものを紹介しよう:
ナンバーズ= [1, 3, 4, 7, 8, 12, 15]
result= [] (結果)numbers.each { |num|result<<num*numifnum.odd?}
見ての通り、それは可能だが、Pythonほどエレガントではない。
すべてのクラスは変更可能
Rubyでは、すべてのクラスはミュータブルです。どういう意味か?組み込みのクラスであっても、すべてのクラスのメソッドを追加したりオーバーライドしたりすることができる。例えば、文字列中のすべての文字anをbに変更するメソッドが欲しいとしよう。それは簡単な方法でできる:
example.rb
クラスString
def atob!self.gsub!(/a/, 'b')終了
終わり
string= 'a文字が多い文字列の例'文字列を置く
文字列.atob!
文字列を置く
結果
$ ruby example.rb
a文字が多い文字列の例
b文字が複数ある文字列の例
概要
ウェブ開発 は、常に様々なものを取り入れ、形にしていくダイナミックな分野である。 プログラミング言語 をそのニーズに合わせて選ぶことができる。この分野で人気のある2つの選択肢は Pythonプログラミング言語 とルビー。どちらも、その価値は ウェブアプリケーションの構築 などがあり、それぞれに利点と欠点がある。
Python は 高水準プログラミング言語 そのシンプルさと コードの可読性初心者のプログラマーには魅力的な機能だ。その Pythonプログラミング言語 は汎用性が高く、さまざまな作業に使用できる。この 汎用プログラミング言語 は機械学習やビッグデータなどの分野でよく使われる、 ウェブ開発.幅広い Python開発者コミュニティ ライブラリやフレームワークの豊富なエコシステムに貢献し、次のような用途に適している。 ウェブアプリケーションの構築.Django、Flask、Pyramidなどがある。 Python ウェブフレームワーク が活用した。 ウェブ開発者 世界中に。
一方、ルビーはもう一人の 高水準汎用プログラミング言語その柔軟性と表現力が光る。この オブジェクト指向プログラミング言語 のバックボーンとなっている。 ウェブアプリケーション.Rubyの魅力は、次のことを容易にする能力にある。 ウェブ開発 を通して Railsフレームワークのための強力なツールである。 ウェブアプリケーションの構築 急速に。
Rubyは Pythonを誇る。 ルビー・コミュニティ そのため、多くのライブラリーやツールを継続的に開発・維持することで、選手たちの経験をより豊かなものにしている。 ウェブ開発者 この言語を使ってこの言語は オブジェクト指向言語Rubyは、そのエレガントさと、クリーンで読みやすいコードで評価されており、小規模なものから大規模なものまで、Rubyを選択するのに適しています。 ウェブアプリケーション.
Python とルビーは、次のように オブジェクト指向プログラミング言語多くの共通点がある。また、以下の点も共通している。 関数型プログラミングプログラマーに様々なスタイルでのコーディングを提供する。 Pythonコード特に、そのわかりやすい構文が高く評価されている。 可読性.
それぞれの言語には強みがある; Pythonの 多用途で幅広い コミュニティ をサポートしているため、様々なタスクに対応できる優れたツールとなっている。 Railsフレームワーク の有力候補となる。 ウェブアプリ 開発.のユニークなニーズと嗜好である。 ウェブ開発者 を決定する。 言語 彼らのために プロジェクト.
の領域では オペレーティングシステムどちらの言語も素晴らしいポータビリティを発揮し、以下のような多くのタスクに適している。 ウェブ開発.したがって、この決闘で決定的な「勝者」を宣言するのは難しい。
一方 Pythonプログラミング言語 より広いリーチと規模を持つ コミュニティRubyの能力を過小評価してはならない。これらの言語を完全に理解するためには、これらの言語を深く掘り下げ、その複雑さを理解し、最も輝くところに適用しなければならない。あなたが ウェブアプリケーションの作成 と Python またはルビー、それぞれ 言語 は、高品質のサービスを提供するための堅牢なプラットフォームを提供します。 ウェブアプリ.Rubyは、あまり知られていないが、確かに、その世界では正当な評価に値する。 プログラミング言語.