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オブジェクト、ラムダ式といった種類の無名関数があります。
