PythonからRubyへ

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でアンダースコアの数によって実現しているアクセス制御は、 publicprivateprotectedを使って行います。
  • 多重継承の代わりにMix-inを使います。
  • 組み込みクラスにメソッドを追加したり、書き換えたりできます。 どちらの言語でも任意の時点でクラスを開いたり編集できますが、 Pythonでは組み込みクラスに対してはそれは許可されていないのに対し、 Rubyではその制限はありません。
  • TrueFalseは、truefalseになります。 また、Noneの代わりはnilになります。
  • 真か偽かの判定では、falsenilのみが偽と評価されます。 それ以外の値(00.0""[]など)はすべて真と評価されます。
  • elifの代わりにelsifを使います。
  • importの代わりにrequireを使います。それ以外の使い方は同じです。
  • (docstring の代わりに)クラスやメソッドの直前に書かれた複数行のコメントは、 ドキュメント生成に使われます。
  • たくさんの省略記法があります。けれど、すぐに手になじむはずです。 それらはRubyをより楽しく生産的に使えるようにするために用意されています。
  • 一度定義した変数を、(Pythonでいうdelのように)未定義にする方法はありません。 変数をnilで設定すれば、変数に入っていた値をGCできるようにはできますが、 スコープが存在する限り変数自体はシンボルテーブルに残り続けます。
  • yieldキーワードの振る舞いは異なります。 Pythonでは、関数呼び出しの外側のスコープへ実行結果を返します。 そのため、外側のコードは処理の再開について責任を負います。 Rubyでは、yieldは最後の引数として渡された別の関数が実行されます。 そして、実行が完了すると処理を再開します。
  • Pythonがサポートしている無名関数はラムダ式のみですが、 Rubyはブロック、Procオブジェクト、ラムダ式といった種類の無名関数があります。