Pythonは、Rubyと同様、とてもよくできた汎用的なプログラミング言語です。 PythonからRubyへやってきたなら、Pythonよりもほんの少しだけ構文が多いことに気づくでしょう。
Pythonとの類似
Pythonと同様に、Rubyは…
irb
と呼ばれる対話型の実行環境があります。- コマンドライン上でドキュメントを読めます
(
pydoc
の代わりにri
コマンドを使います)。 - 通常の改行を除いて、特殊な行区切りはありません。
- Pythonにおける三重引用符のように、文字列リテラルを複数行に記述できます。
- 角かっこはリストを示すために使われ、 波かっこは辞書(Rubyではハッシュと呼ばれます)を表すために使われます。
- 配列は同じように機能します(
要素を追加すれば配列は大きくなっていきます。
a3 = [ a1, a2 ]
のように書けば配列の配列を作って、 それらを構造化することもできます)。 - オブジェクトは強力で動的な型付けを持ちます。
- すべてはオブジェクトです。そして、変数はオブジェクトへのただの参照です。 キーワードは若干の違いがありますが、だいたい同じように機能します。
- rdocという埋め込み型のドキュメントツールがあります。
- 第一級関数、無名関数、クロージャといった関数型プログラミングを行うための 道具立てもそろっています。
Pythonとの違い
Pythonと違って、Rubyは…
- 文字列は可変です。
- 定数(値が変更されることを期待しない変数)をつくれます。
- 名前付けについての規約がいくつかあります。 たとえば、クラス名は大文字から始め、変数名は小文字で始めます。
- リストコンテナは、配列しかありません。配列は可変です。
- 二重引用符で囲まれた文字列は、エスケープシーケンス(
\t
など)や、 式展開(いちいち+
で文字列連結すること無しに、 Rubyの式を評価した結果を他の文字列に挿入可能にするしくみ)を解釈します。 一重引用符で囲まれた文字列は、Pythonでいうraw文字列と同じ扱いとなります。 - クラスに新しいスタイル・古いスタイルといったものはありません (Python3からはこの問題はなくなりました。けれど、Python2との完全な後方互換性はありません)。
- 属性には直接アクセスできません。 Rubyでは、属性へのアクセスはすべてメソッド経由になります。
- メソッド呼び出しの括弧は基本的にオプションです。
- Pythonでアンダースコアの数によって実現しているアクセス制御は、
public
、private
、protected
を使って行います。 - 多重継承の代わりにMix-inを使います。
- 組み込みクラスにメソッドを追加したり、書き換えたりできます。 どちらの言語でも任意の時点でクラスを開いたり編集できますが、 Pythonでは組み込みクラスに対してはそれは許可されていないのに対し、 Rubyではその制限はありません。
True
とFalse
は、true
とfalse
になります。 また、None
の代わりはnil
になります。- 真か偽かの判定では、
false
とnil
のみが偽と評価されます。 それ以外の値(0
、0.0
、""
、[]
など)はすべて真と評価されます。 elif
の代わりにelsif
を使います。import
の代わりにrequire
を使います。それ以外の使い方は同じです。- (docstring の代わりに)クラスやメソッドの直前に書かれた複数行のコメントは、 ドキュメント生成に使われます。
- たくさんの省略記法があります。けれど、すぐに手になじむはずです。 それらはRubyをより楽しく生産的に使えるようにするために用意されています。
- 一度定義した変数を、(Pythonでいう
del
のように)未定義にする方法はありません。 変数をnil
で設定すれば、変数に入っていた値をGCできるようにはできますが、 スコープが存在する限り変数自体はシンボルテーブルに残り続けます。 yield
キーワードの振る舞いは異なります。 Pythonでは、関数呼び出しの外側のスコープへ実行結果を返します。 そのため、外側のコードは処理の再開について責任を負います。 Rubyでは、yield
は最後の引数として渡された別の関数が実行されます。 そして、実行が完了すると処理を再開します。- Pythonがサポートしている無名関数はラムダ式のみですが、 Rubyはブロック、Procオブジェクト、ラムダ式といった種類の無名関数があります。