Ruby(ルビー)は、まつもとゆきひろ(通称: Matz)により開発された、簡潔な文法が特徴的なオブジェクト指向スクリプト言語。

日本で開発されたプログラミング言語としては初めて国際電気標準会議(IEC)で国際規格に認証された事例となった。

## 概要

Ruby は1993年2月24日に生まれ、1995年12月にfj上で発表された。名称の Ruby は、プログラミング言語 Perl が6月の誕生石である Pearl(真珠)と同じ発音をし、「Perlに続く」という意味で、6月の次の誕生石(7月)のルビーから名付けられた。競合言語として Perl の他に Python があり、「Matz(まつもと) が Python に満足していれば Ruby は生まれなかったであろう」と公式のリファレンスの用語集で言及されている。

機能として、クラス定義、ガベージコレクション、強力な正規表現処理、マルチスレッド、例外処理、イテレータ、クロージャ、Mixin、利用者定義演算子などがある。Perl を代替可能であることが初期の段階から重視されている。Perlと同様にグルー言語としての使い方が可能で、C言語プログラムやライブラリを呼び出す拡張モジュールを組み込むことができる。

Ruby 処理系は、インタプリタとコンパイラが存在する(詳しくは#実装を参照)。

可読性を重視した構文となっている。Ruby においては整数や文字列なども含めデータ型はすべてがオブジェクトであり、純粋なオブジェクト指向言語といえる。

長らく言語仕様が明文化されず、まつもとによる実装が言語仕様に準ずるものとして扱われて来たが、2010年6月現在、JRuby や Rubinius といった互換実装の作者を中心に機械実行可能な形で明文化する RubySpec という試みが行われている。公的規格としては2011年3月22日にJIS規格(JIS X 3017)が制定され、その後2012年4月1日に日本発のプログラム言語では初めてISO/IEC規格(ISO/IEC 30170)として承認された
。

自由ソフトウェアとしてバージョン1.9.2までは Rubyライセンス(Ruby License や Ruby'sと表記されることもある。GPLかArtisticに似た独自ライセンスを選択するデュアルライセンス)で配布されていたが、バージョン1.9.3以降は2-clause BSDLとのデュアルライセンスで配布されている。

## ゆかりのある地域

Rubyは日本の国産言語として知られており、特にRubyとゆかりのある地域はRubyの聖地と呼ばれている。

- 静岡県浜松市 - 開発者のまつもとゆきひろが日本タイムシェア株式会社(現:TIS株式会社)の浜松市にあった研究所に勤務していた1993年にRubyの開発を開始。
- 愛知県名古屋市 - 株式会社トヨタケーラム(現:株式会社トヨタシステムズ)在籍時、1995年にRubyをオープンソースソフトウェアとして公開。
- 島根県松江市 - 1997年から島根県松江市に移り、同市の株式会社ネットワーク応用通信研究所 (NaCl)フェローとしてRubyの普及に尽力。

## 設計思想

開発者のまつもとゆきひろは、「Rubyの言語仕様策定において最も重視しているのはストレスなくプログラミングを楽しむことである (enjoy programming)」と述べている。

ただし、まつもとによる明文化された言語仕様は存在しない。Perlのモットー「やり方はいろいろある (There's More Than One Way To Do It; TMTOWTDI)」は「多様性は善 (Diversity is Good)」というスローガンで Ruby に引き継がれてはいるものの最重要なものではないとも述べており、非推奨な手法も可能にするとともに、そのような手法を言語仕様により使いにくくすることによって自粛を促している。

また、まつもとは『まつもとゆきひろ コードの世界 スーパー・プログラマになる14の思考法』でもRubyの開発理由を次のように述べている。

また、英語圏の開発者の間ではMINASWAN (Matz is nice and so we are nice. 和訳: まつもとがナイスだから我々もナイスであろう) の標語が用いられている。

「Python、PHP、Perlでは静的型を導入しているため、Rubyも型を導入するべきでは」と長年言われているが、まつもとは「Rubyに型を取り入れたくない。DRY (Don't repeat yourself)ではないから⁠」⁠「⁠型宣言することはコンピュータに使われているような気になる」と否定的であり、2019年5月現在Rubyに静的型が導入される予定はない。

クラス名はアルファベットの大文字から始めるという制約があり、日本語などの非ASCII文字のみでクラス名を定義する方法がない。この件についてまつもとは以下のように語っており、英語を共通言語として使うべきであるという立場を表明している。

## 実装

### 公式な実装

Rubyの公式な実装には、以下の二種類が存在する。

## 例

基本的なコード

### コレクション

配列の作成と使用法

ハッシュの作成と使用法

### 制御構造

ほかの言語でもよくみられるような制御構造を用いることができる。

上記、

は、

のような記述もできる。

一部の制御構造は後述するイテレータで代替することができる。

### ブロック付きメソッド呼び出し

Ruby ではブロック付きメソッド呼び出しを用いるコードが好まれることが多い。これを用いると、ユーザー定義の制御構造やコールバックなど様々な処理を簡潔に記述できるからである。

ブロックとは波括弧 `{`、`}` または `do`、`end` によって囲まれたコード列のことである。メソッド呼び出しの末尾に記述することが出来る。この2つは基本的に同一だが、結合の優先度が異なる。慣習的に一行で書くときは波括弧が、複数行に渡る場合は`do`、`end`が使用される場合が多い。

ブロック付きメソッド呼び出しが繰り返し処理を主な役割としていたことから、イテレータと呼ばれていた時期がある。しかし、実際には繰り返し処理にとどまらず、様々な使われ方をしているので、最近はブロック付きメソッド呼び出し全体の総称としてイテレータという名称を用いるのは適切でないと考えられている。

#### 繰り返し処理

配列の各要素への繰り返し処理

以下はブロックを使わずに同じことを行う場合

指定した回数の繰り返し処理

`gsub()`による文字列置換の繰り返し処理

#### 後処理の省力化

ブロックの内容を実行してから、決められた後処理を行うメソッドもある。

これは次の例と同様の処理を行う(`ensure` については例外処理の項を参照)

#### 本処理を後から指定

実際に行いたい処理をブロックで記述する。前項の後処理の省力化もこれの一例といえる。

この例は、ツリーから要素と分枝をつぎつぎと取り出して取り出したものになんらかの処理を行うものである。メソッドの利用者は、なんらかの処理のみを記述すればよく、取り出しのアルゴリズムなど、本質的でない内容に意識を向ける必要がなくなる。

#### クロージャ

クロージャとなるようなブロックの引数渡し

メソッドからクロージャを返す例

### クラス

次のコードは`Person`という名前のクラスである。その中、まず`initialize`はオブジェクトを初期化するコンストラクタである。ほかに2つのメソッドがあり、1つは比較演算子である`<=>`をオーバーライドしており`Array#sort`によりプロパティ`age`でソートすることができる。もう1つのオーバーライド箇所の`to_s`メソッドは `Kernel#puts` での表示の形式を整える。`attr_reader`は Ruby におけるメタプログラミングの例であり、`attr` はインスタンス変数の入出力を司る、いわゆる値を取得する `getter` メソッドや値を設定する `setter` メソッド(アクセサ)を定義する。`attr_reader`は `getter` メソッドのみの定義である。なおメソッド中では最後に評価された式が返り値となり、明示的な`return`は省略できる。

結果は3つの名前が年の大きい順に表示される

### 例外処理

例外は不具合が起こったとき`raise`の呼び出しで発生させることができる。Ruby での例外は `Exception` クラスか、そのサブクラスのインスタンスである。

例外にはメッセージを追加することもできる

さらに例外のタイプも指定できる

例外は`rescue`節で処理することができ、次のようにコードに`rescue`を付加するだけである

### 不向きな処理

ベンチマークテストで使用される以下のようなコードを実行したとき、処理速度が著しく低下することがある。

## Rubyの周辺技術

- 分散オブジェクトを実現する dRuby
- Ruby スクリプトに埋め込むことができる文書形式RD
- Ruby によるRDを採用したウィキ、RWiki
- Ruby からSDLライブラリを扱えるようにするRuby/SDL
- Ruby から Delphi を扱えるようにする Apollo
- Ruby によるウェブアプリケーションフレームワーク Ruby on Rails
- Ruby の処理系の一つでRuby1.9以後の処理系として採用されている YARV
- Ruby の統合開発環境 RDE
- Ruby のコードを Windows の実行形式ファイルに変換する Exerb
- Ruby 用のライブラリ管理システムである RubyGems
- Apache HTTP Server に組み込むための mod ruby
- サーバサイドでHTMLへの埋め込み Ruby 文を実現する eRuby
- Ruby のコードをJavaScriptへ変換するコンパイラ Opal
- Microsoft Windows の ActiveX 環境で Ruby インタープリターを呼び出す ActiveScriptRuby(Internet Explorer 限定だがHTMLに埋めこんでクライアント上で動かすスクリプト言語として Rubyを指定できるようになる)
- Ruby から Win32API やCOMコンポーネントを呼び出すためのライブラリー WIN32OLE
- JavaScript や Flash 上で動く Ruby の処理系 HotRuby
- Ruby によるビヘイビア駆動開発のためのフレームワーク RSpec
- Ruby で書かれたビルドツール Rake
- Ruby で書かれたmacOS パッケージ管理システム homebrew
- Ruby からDirectXを使用するための拡張ライブラリ DXRuby
- Ruby プログラミングを視覚的直感的に開発可能とする、Scratch (プログラミング言語)のRuby対応版(Rubyソースを生成するScratchとも言えるもの)とでも言うべきGUI型IDE Smalruby

## Rubyで開発されたアプリケーション

- tDiary
- 影舞
- Hiki
- Chef
- Vagrant
- Ruby on Rails
  - GitHub
  - Metasploit
  - Redmine
  - Basecamp
  - RadiantCMS
- qwikWeb
- WEBrick
- Mongrel
- Phusion Passenger
- Puppet
- mikutter
- Serverspec

## エピソード

Ruby ではブロック構造を `end` で終える構文が採用されているが、開発者のまつもとゆきひろは他の構文が採用される可能性があったことを述べている。当時、Emacs 上で `end` で終える構文をオートインデントさせた例はあまりなく、Ruby 言語用の編集モードにオートインデント機能を持たせられるかどうかが問題になっていたためである。実際には数日の試行でオートインデント可能であることがわかり、現在の構文になった。C言語のような`{〜}`を使った構文も検討されていたが、結局これは採用されなかった。

### 「Rubyは死んだ」

「Rubyはよく『死んだ』って言われる言語である」とまつもとは認識しておりTwitterがRuby on RailsからJava仮想マシン用言語のScalaに移行した話などを例に出し「Rubyは死んだ」みたいに言われることが増えたとしているほか、オランダのTIOBEという会社が発表しているプログラミング言語の人気ランキングでRubyが上位に入らないことをもってして「Rubyは死んだ」「Rubyは凋落している」と見られることがあるが、「RubyとかRuby on Railsだと、さまざまなジャンルで実際の適用例があるので、なにか困ったとき同じ問題に直面した人を探せたり、あるいはその問題を解決するRubyGemsを見つけられる。そういう点でいうと、トータルの生産性はかなり高いことがある」「実際に仕事として、あるいは自分のプロダクトを作るときに、どんな言語を選択してどういうふうに開発したらいいのかを考えると、Rubyの持っているビジネス上の価値はそんなに下がっていないと思います。たとえ順位が下がって、表面上Rubyの人気が凋落したように見えても、ある意味『まだまだ大丈夫』が1つの見識だと思います」とまつもとは述べている。

### Ruby on RailsがPythonで作られなかった理由

デイヴィッド・ハイネマイヤー・ハンソンがRuby on Railsを構築するのにPythonを選ばなかった理由として「私の場合は、恋に落ちたのがRubyなのです。私はRubyに恋をしていますし、もう14年間もそうなのです。(中略)『最適なツール』などというものは存在しないのです。あなたの脳をちょうどいい具合に刺激するパズルがあるだけなのです。今日では、ほぼなんでも作ることができます。そして、それを使って、さらに何でも作れてしまうのです。これは素晴らしいことです。表現や言語、そして思考の多様性に乾杯しましょう!」と質問サイトのQuoraで本人が回答している。

### まつもとゆきひろが書いたコードの割合

2020年9月8日現在、RubyのCコード509,802行のうち、まつもとがコミットしたのは36,437行で1割以下になっている。