Rubyのコードを目にすると、
他の言語と似た部分があることに気が付くはずです。
構文の多くは、(他の言語の中でも特に)PerlやPython、
Javaプログラマーにとって馴染みのあるものになっています。
もしあなたがそうした言語に慣れ親しんでいるのなら、
Rubyを学ぶのはおそらくどうってことないはずです。
{: .summary}

このドキュメントは2部構成になっています。
このページでは、プログラミング言語*X*からRubyへ移ってくる際に役立つ情報をざっと紹介します。
個別のページでは、Rubyの主な言語機能を紹介しつつ、
あなたが慣れ親しんできた言語との比較を行います。

## 求められていること: *言語X*からRubyへ

* [C・C++からRubyへ](to-ruby-from-c-and-cpp/)
* [JavaからRubyへ](to-ruby-from-java/)
* [PerlからRubyへ](to-ruby-from-perl/)
* [PHPからRubyへ](to-ruby-from-php/)
* [PythonからRubyへ](to-ruby-from-python/)

## 重要な言語機能と知っておくべきこと

ここでは、Rubyを学習する中で出会ういくつかの主要な機能について、
参照先やヒントを示します。

### イテレーション

Rubyの特徴であるブロックとイテレータは、
これまでにあまり見たことがない、あるいは使い慣れていないものかもしれません。
(CやC++、1.5以前のJavaのような)インデックスを使った繰り返し処理や、
(Perlの`for (@a) {...}`やPythonの`for i in aList: ...`のような)
リストをループする処理の代わりに、
Rubyでは次のようなコードをよく見ることになるでしょう。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">some_list</span><span class="p">.</span><span class="nf">each</span> <span class="k">do</span> <span class="o">|</span><span class="n">this_item</span><span class="o">|</span>
  <span class="c1"># ここはブロックの中になります。</span>
  <span class="c1"># this_itemを扱う処理をここに書きます。</span>
<span class="k">end</span></code></pre></figure>

`each`(や`collect`、`find`、`inject`、`sort`など)について詳しくは、
`ri Enumerable`を参照してみてください（そして、次に
`ri Enumerable#some_method`として具体的なメソッドを参照してみてください)。

### すべては値

式と文に違いはありません。
すべては値を持ちます。`nil`であっても例外ではありません。
Rubyでは次のように書くことが可能です。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="n">x</span> <span class="o">=</span> <span class="mi">10</span>
<span class="n">y</span> <span class="o">=</span> <span class="mi">11</span>
<span class="n">z</span> <span class="o">=</span> <span class="k">if</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">y</span>
      <span class="kp">true</span>
    <span class="k">else</span>
      <span class="kp">false</span>
    <span class="k">end</span>
<span class="n">z</span> <span class="c1"># =&gt; true</span></code></pre></figure>

### シンボルは軽量文字列ではない

多くのRuby初学者はシンボルが何であるか、どう使えばよいのかを理解するのに苦戦します。

シンボルは識別子として記述するのに適しています。
シンボルは、**どんな物か**ではなく、**何者であるか**がすべてです。
`irb`を立ち上げて、次の違いを見てみてください。

<figure class="highlight"><pre><code class="language-irb" data-lang="irb"><span class="gp">irb(main):001:0&gt;</span><span class="w"> </span><span class="ss">:george</span><span class="p">.</span><span class="nf">object_id</span> <span class="o">==</span> <span class="ss">:george</span><span class="p">.</span><span class="nf">object_id</span>
<span class="p">=&gt;</span> <span class="kp">true</span>
<span class="gp">irb(main):002:0&gt;</span><span class="w"> </span><span class="s2">"george"</span><span class="p">.</span><span class="nf">object_id</span> <span class="o">==</span> <span class="s2">"george"</span><span class="p">.</span><span class="nf">object_id</span>
<span class="p">=&gt;</span> <span class="kp">false</span>
<span class="gp">irb(main):003:0&gt;</span></code></pre></figure>

`object_id`メソッドはオブジェクトのIDを返します。
もし二つのオブジェクトが同じ`object_id`を持っていれば、
それらはメモリ上の同じ実体を指すものであると言えます。

上記で見たとおり、一度でもシンボルを使ったなら、
同じ文字からなるシンボルは、いずれもメモリ内の同じオブジェクトを参照します。
同じ文字で表された2つのシンボルは、同じ`object_id`を指します。

次に文字列("george")の方を見てみましょう。
`object_id`は一致していません。
これは、二つの文字列が異なる実体を指していることを示しています。
新しい文字列を使うと、Rubyは毎回その文字列のために新しいメモリ領域を確保します。

シンボルを使うか文字列を使うかで迷ったなら、
ハッシュのキーのようにオブジェクトを識別したいのか、
それとも前述の"george"などのようにコンテンツを表したいのかを、
選択の指針にしてください。

### すべてはオブジェクト

「すべてはオブジェクト」は誇張ではありません。
クラスや整数でさえオブジェクトです。
他のオブジェクトと同じように扱うことができます。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># 以下のクラス定義と同じことを行っています</span>
<span class="c1"># class MyClass</span>
<span class="c1">#   attr_accessor :instance_var</span>
<span class="c1"># end</span>
<span class="no">MyClass</span> <span class="o">=</span> <span class="no">Class</span><span class="p">.</span><span class="nf">new</span> <span class="k">do</span>
  <span class="nb">attr_accessor</span> <span class="ss">:instance_var</span>
<span class="k">end</span></code></pre></figure>

### 可変な定数

定数は厳密な意味での定数ではありません。
初期化済みの定数を変更したとしても、
警告はされますが、プログラムは停止しません。
だからと言って、定数を再定義するべきだということではありません。

### 名前付けの規約

Rubyにはいくつか名前付けについての規約があります。
大文字から始まる識別子は定数です。
ドルマーク(`$`)から始まる識別子はグローバル変数、
`@`から始まる識別子はインスタンス変数、
`@@`から始まる識別子はクラス変数になります。

メソッド名は大文字から始めることもできます。
けれど、それは次のような混乱を招くことになるでしょう。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="no">Constant</span> <span class="o">=</span> <span class="mi">10</span>
<span class="k">def</span> <span class="nf">Constant</span>
  <span class="mi">11</span>
<span class="k">end</span></code></pre></figure>

こうすると、`Constant`は10ですが、`Constant()`は11になります。

### キーワード引数

メソッドはRuby 2.0から、Pythonのように、
キーワード引数を定義できるようになりました。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">deliver</span><span class="p">(</span><span class="ss">from: </span><span class="s2">"A"</span><span class="p">,</span> <span class="ss">to: </span><span class="kp">nil</span><span class="p">,</span> <span class="ss">via: </span><span class="s2">"mail"</span><span class="p">)</span>
  <span class="s2">"Sending from </span><span class="si">#{</span><span class="n">from</span><span class="si">}</span><span class="s2"> to </span><span class="si">#{</span><span class="n">to</span><span class="si">}</span><span class="s2"> via </span><span class="si">#{</span><span class="n">via</span><span class="si">}</span><span class="s2">."</span>
<span class="k">end</span>

<span class="n">deliver</span><span class="p">(</span><span class="ss">to: </span><span class="s2">"B"</span><span class="p">)</span>
<span class="c1"># =&gt; "Sending from A to B via mail."</span>
<span class="n">deliver</span><span class="p">(</span><span class="ss">via: </span><span class="s2">"Pony Express"</span><span class="p">,</span> <span class="ss">from: </span><span class="s2">"B"</span><span class="p">,</span> <span class="ss">to: </span><span class="s2">"A"</span><span class="p">)</span>
<span class="c1"># =&gt; "Sending from B to A via Pony Express."</span></code></pre></figure>

### 普遍の真理

Rubyでは、`nil`と`false`を除くすべてのものは真と評価されます。
CやPythonを始めとする多くの言語では、0あるいはその他の値、空のリストなどは
偽と評価されます。次に示すPythonコードをみてください
(他の言語でもだいたい同じようなコードになるでしょう)。

<figure class="highlight"><pre><code class="language-python" data-lang="python"><span class="c1"># Python版
</span><span class="k">if</span> <span class="mi">0</span><span class="p">:</span>
  <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">0 is true</span><span class="sh">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
  <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">0 is false</span><span class="sh">"</span><span class="p">)</span></code></pre></figure>

このコードを実行すると「0 is false」と出力されます。
同じコードをRubyで書くと以下のようになります。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># Ruby版</span>
<span class="k">if</span> <span class="mi">0</span>
  <span class="nb">puts</span> <span class="s2">"0 is true"</span>
<span class="k">else</span>
  <span class="nb">puts</span> <span class="s2">"0 is false"</span>
<span class="k">end</span></code></pre></figure>

このコードを実行すると、
「0 is true」が出力されることになります。

### アクセス修飾子はスコープの最後まで適用される

次のRubyコードを見てください。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">MyClass</span>
  <span class="kp">private</span>
  <span class="k">def</span> <span class="nf">a_method</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span>
  <span class="k">def</span> <span class="nf">another_method</span><span class="p">;</span> <span class="kp">false</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

`another_method`がpublicメソッドになることを期待するかもしれませんが、
結果はそうなりません。
`private`アクセス修飾子はスコープの終わりか、他のアクセス修飾子が
あらわれるまで継続されます。
デフォルトでは、メソッドはpublicになります。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">MyClass</span>
  <span class="c1"># a_methodはpublicです</span>
  <span class="k">def</span> <span class="nf">a_method</span><span class="p">;</span> <span class="kp">true</span><span class="p">;</span> <span class="k">end</span>

  <span class="kp">private</span>

  <span class="c1"># another_methodはprivateです</span>
  <span class="k">def</span> <span class="nf">another_method</span><span class="p">;</span> <span class="kp">false</span><span class="p">;</span> <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

`public`、`private`、`protected`は実際にはメソッドになるので、
引数を受けることができます。これらにシンボルを渡した場合には、
そのメソッドの可視性が変更されます。

### アクセス制御

Javaでは、`public`は誰でもアクセスできることを意味しています。
そして、`protected`はクラスおよび継承関係にあるクラスのインスタンス、
クラスと同じパッケージにあるクラスのインスタンスからアクセスできること、
`private`はクラスのインスタンスからのみアクセスできることを、
ぞれぞれ意味します。

Rubyでは扱いが若干異なります。
`public`はそのままの意味になります。
`private`は、レシーバなしで呼び出すことができる場合に、
そのメソッドへアクセス可能となります。
つまり、`self`のみがprivateメソッドを呼び出す際のレシーバとなります。

`protected`は気をつけて扱う必要があります。
protectedメソッドはクラスか継承関係にあるクラスのインスタンスからのみ
呼び出すことができます。しかしまた、
レシーバとしてインスタンスを指定しても呼び出すことができてしまいます。
以下に例を示します([The Ruby Language FAQ][faq]から引用)。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Test</span>
  <span class="c1"># デフォルトはpublic</span>
  <span class="k">def</span> <span class="nf">identifier</span>
    <span class="mi">99</span>
  <span class="k">end</span>

  <span class="k">def</span> <span class="nf">==</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
    <span class="n">identifier</span> <span class="o">==</span> <span class="n">other</span><span class="p">.</span><span class="nf">identifier</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">=</span> <span class="no">Test</span><span class="p">.</span><span class="nf">new</span>  <span class="c1"># =&gt; #&lt;Test:0x34ab50&gt;</span>
<span class="n">t2</span> <span class="o">=</span> <span class="no">Test</span><span class="p">.</span><span class="nf">new</span>  <span class="c1"># =&gt; #&lt;Test:0x342784&gt;</span>
<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>       <span class="c1"># =&gt; true</span>

<span class="c1"># ここで`identifier'をprotectedにする。</span>
<span class="c1"># protected はレシーバとして`other'を許容するため、これは動作する。</span>

<span class="k">class</span> <span class="nc">Test</span>
  <span class="kp">protected</span> <span class="ss">:identifier</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>  <span class="c1"># =&gt; true</span>

<span class="c1"># ここで`identifier'をprivateにする。</span>

<span class="k">class</span> <span class="nc">Test</span>
  <span class="kp">private</span> <span class="ss">:identifier</span>
<span class="k">end</span>

<span class="n">t1</span> <span class="o">==</span> <span class="n">t2</span>
<span class="c1"># NoMethodError: private method `identifier' called for #&lt;Test:0x342784&gt;</span></code></pre></figure>

### クラスは開いている

Rubyのクラスは開いています。
いつでもクラスを開いて、定義を足したり、変更することができます。
`Integer`や、すべてのオブジェクトの祖先である`Object`のようなクラスであっても、
自由に再定義することが可能です。Ruby on Railsは、次のような
`Integer`に時間を扱うメソッド群を定義しています。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Integer</span>
  <span class="k">def</span> <span class="nf">hours</span>
    <span class="nb">self</span> <span class="o">*</span> <span class="mi">3600</span> <span class="c1"># 1時間あたりの秒数を返します</span>
  <span class="k">end</span>
  <span class="k">alias</span> <span class="n">hour</span> <span class="n">hours</span>
<span class="k">end</span>

<span class="c1"># 1月1日の0時0分から14時間後</span>
<span class="no">Time</span><span class="p">.</span><span class="nf">mktime</span><span class="p">(</span><span class="mi">2006</span><span class="p">,</span> <span class="mo">01</span><span class="p">,</span> <span class="mo">01</span><span class="p">)</span> <span class="o">+</span> <span class="mi">14</span><span class="p">.</span><span class="nf">hours</span> <span class="c1"># =&gt; Sun Jan 01 14:00:00</span></code></pre></figure>

### 不思議なメソッド名

Rubyでは、メソッド名の最後に疑問符(?)や感嘆符(!)が使われることがあります。
慣習的に、問い合わせ系のメソッドの最後には疑問符が使われます
(例: レシーバが空の場合に`true`を返す`Array#empty?`)。
また、使用に危険を伴うメソッドの最後には感嘆符が使われます
(例: `self`あるいは引数の内容を書き換えるようなメソッド。`exit!`など)。
けれど、危険なメソッドすべてがこの慣習に従っているわけでも
ないことに注意してください。
`Array#replace`は、与えられた配列の内容で配列の内容を置き換えます。
この操作は、自身を**変更しない**ようなメソッド名とは意に反する振る舞いをします。

### 特異メソッド

特異メソッドはオブジェクト単位のメソッドです。
特異メソッドは、定義したオブジェクトからだけ利用できるメソッドになります。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Car</span>
  <span class="k">def</span> <span class="nf">inspect</span>
    <span class="s2">"Cheap car"</span>
  <span class="k">end</span>
<span class="k">end</span>

<span class="n">porsche</span> <span class="o">=</span> <span class="no">Car</span><span class="p">.</span><span class="nf">new</span>
<span class="n">porsche</span><span class="p">.</span><span class="nf">inspect</span> <span class="c1"># =&gt; Cheap car</span>
<span class="k">def</span> <span class="nc">porsche</span><span class="o">.</span><span class="nf">inspect</span>
  <span class="s2">"Expensive car"</span>
<span class="k">end</span>

<span class="n">porsche</span><span class="p">.</span><span class="nf">inspect</span> <span class="c1"># =&gt; Expensive car</span>

<span class="c1"># 他のオブジェクトには影響しない</span>
<span class="n">other_car</span> <span class="o">=</span> <span class="no">Car</span><span class="p">.</span><span class="nf">new</span>
<span class="n">other_car</span><span class="p">.</span><span class="nf">inspect</span> <span class="c1"># =&gt; Cheap car</span></code></pre></figure>

### 「存在しなかった」メソッド

Rubyはメッセージに対応するメソッドを見つけられなかったとしても諦めません。
その場合は、見つけられなかったメソッド名と引数と共に、
`method_missing`メソッドを呼び出します。
`method_missing`メソッドはデフォルトではNameError例外を投げますが、
アプリケーションに合うように再定義することもできます。
実際、多くのライブラリがそのようにしています。
以下がその例です。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># idは呼び出されたメソッド名です。</span>
<span class="c1"># *構文は「arguments」という名前の配列に</span>
<span class="c1"># 呼び出されたメソッドに渡されたすべての引数を格納します。</span>
<span class="k">def</span> <span class="nf">method_missing</span><span class="p">(</span><span class="nb">id</span><span class="p">,</span> <span class="o">*</span><span class="n">arguments</span><span class="p">)</span>
  <span class="nb">puts</span> <span class="s2">"Method </span><span class="si">#{</span><span class="nb">id</span><span class="si">}</span><span class="s2"> was called, but not found. It has "</span> <span class="o">+</span>
       <span class="s2">"these arguments: </span><span class="si">#{</span><span class="n">arguments</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="s2">", "</span><span class="p">)</span><span class="si">}</span><span class="s2">"</span>
<span class="k">end</span>

<span class="n">__</span> <span class="ss">:a</span><span class="p">,</span> <span class="ss">:b</span><span class="p">,</span> <span class="mi">10</span>
<span class="c1"># =&gt; Method __ was called, but not found. It has these</span>
<span class="c1"># arguments: a, b, 10</span></code></pre></figure>

このコードは単に呼び出されたメソッドの詳細を出力しているだけですが、
ここには何を書いても良いので、メッセージを受け取って適切な処理を行えます。

### 関数呼び出しではなくメッセージ送信

メソッド呼び出しは実際には他のオブジェクトへの**メッセージ送信**です。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="c1"># これは</span>
<span class="mi">1</span> <span class="o">+</span> <span class="mi">2</span>
<span class="c1"># これと同じで...</span>
<span class="mi">1</span><span class="p">.</span><span class="nf">+</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="c1"># つまりこういうことです。</span>
<span class="mi">1</span><span class="p">.</span><span class="nf">send</span> <span class="s2">"+"</span><span class="p">,</span> <span class="mi">2</span></code></pre></figure>

### ブロックは作りかけのオブジェクト

ブロック(実際にはクロージャ)は標準ライブラリでもすごく使われています。
ブロックを呼び出すには、`yield`を使うか、引数リストに特別な引数を追加して
それを`Proc`オブジェクトにします。以下がその例です。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">def</span> <span class="nf">block</span><span class="p">(</span><span class="o">&amp;</span><span class="n">the_block</span><span class="p">)</span>
  <span class="c1"># この内側では、the_blockはメソッドに渡されたブロックになります。</span>
  <span class="n">the_block</span> <span class="c1"># ブロックが返ります</span>
<span class="k">end</span>
<span class="n">adder</span> <span class="o">=</span> <span class="n">block</span> <span class="p">{</span> <span class="o">|</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="o">|</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="p">}</span>
<span class="c1"># adderはここでProcオブジェクトになります</span>
<span class="n">adder</span><span class="p">.</span><span class="nf">class</span> <span class="c1"># =&gt; Proc</span></code></pre></figure>

`Proc.new`にブロックを渡すか、`lambda`メソッドを呼び出すことで、
メソッド呼び出しの外側でブロックを作成することもできます。

同様に、メソッドもまた作りかけのオブジェクトです。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="nb">method</span><span class="p">(</span><span class="ss">:puts</span><span class="p">).</span><span class="nf">call</span> <span class="s2">"putsはオブジェクト!"</span>
<span class="c1"># =&gt; putsはオブジェクト!</span></code></pre></figure>

### 演算子は糖衣構文(シンタックスシュガー)

Rubyにおけるほとんどの演算子は糖衣構文です。
いくつかの優先順位規則にもとづいて、メソッド呼び出しを単に書き換えているだけです。
たとえば、Integerクラスの`+`メソッドを次のようにオーバーライドすることもできます。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="k">class</span> <span class="nc">Integer</span>
  <span class="c1"># できるけれど、しないほうがいいでしょう</span>
  <span class="k">def</span> <span class="nf">+</span><span class="p">(</span><span class="n">other</span><span class="p">)</span>
    <span class="nb">self</span> <span class="o">-</span> <span class="n">other</span>
  <span class="k">end</span>
<span class="k">end</span></code></pre></figure>

C++の`operator+`などは必要ありません。

`[]`や`[]=`といったメソッドを定義すれば、配列のようなスタイルでアクセスすることもできます。
(+1や-2みたいな)単項の+や-を定義するには、`+@`か`-@`といったメソッドを定義する必要があります。
けれど、以下の演算子は糖衣構文では**ありません**。
これらはメソッドではないので、再定義できません。

<figure class="highlight"><pre><code class="language-ruby" data-lang="ruby"><span class="o">=</span><span class="p">,</span> <span class="o">..</span><span class="p">,</span> <span class="o">...</span><span class="p">,</span> <span class="ow">not</span><span class="p">,</span> <span class="o">&amp;&amp;</span><span class="p">,</span> <span class="ow">and</span><span class="p">,</span> <span class="o">||</span><span class="p">,</span> <span class="ow">or</span><span class="p">,</span> <span class="o">::</span></code></pre></figure>

加えて`+=`、`*=`などは`var = var + other_var`、`var = var * other_var`
などの処理の略記法になり、これらも再定義できません。

## もっと知りたい

Rubyについてもっと知りたくなったのなら、
[ドキュメント](/ja/documentation/)の
その他のコンテンツを見てみてください。



[faq]: http://ruby-doc.org/docs/ruby-doc-bundle/FAQ/FAQ.html
