Ruby

概要

Ruby は1993年2月24日に生まれ、1995年12月にfj上で発表された。名称の Ruby は、プログラミング言語 Perl が6月の誕生石である Pearl（真珠）と同じ発音をすることから、まつもとの同僚の誕生石（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の言語仕様策定において最も重視しているのはストレスなくプログラミングを楽しむことである (enjoy programming)」と述べている。
Ruby には Perl や Python とは決定的に違う点があり、それこそが Ruby の存在価値なのです。それは「楽しさ」です。私の知る限り、Ruby ほど「楽しさ」について焦点を当てている言語は他にありません。Ruby は純粋に楽しみのために設計され、言語を作る人、使う人、学ぶ人すべてが楽しめることを目的としています。しかし、ただ単に楽しいだけではありません。Ruby は実用性も十分です。実用性がなければ楽しめないではありませんか。
 — まつもとゆきひろ、Ruby プログラミング入門 まえがき 監修者よりのページ
ただし、まつもとによる明文化された言語仕様は存在しない。Perlのモットー「やり方はいろいろある (There's More Than One Way To Do It; TMTOWTDI)」は「多様性は善 (Diversity is Good)」というスローガンで Ruby に引き継がれてはいるものの最重要なものではないとも述べており、非推奨な手法も可能にするとともに、そのような手法を言語仕様により使いにくくすることによって自粛を促している。

例

基本的なコード
# 文字列、数値を含め、全てがオブジェクトである-199.abs                                       # 199"ruby is cool".length                          # 12"Rick".index("c")                              # 2"Nice Day Isn't It?".split(//).uniq.sort.join  # " '?DINaceinsty"

コレクション

配列の作成と使用法
a = [1, 'hi', 3.14, 1, 2, [4, 5]]a[2]                      # 3.14a.reverse                 # [[4, 5], 2, 1, 3.14, 'hi', 1]a.flatten.uniq            # [1, 'hi', 3.14, 2, 4, 5]
ハッシュの作成と使用法
hash = {'water' => 'wet', 'fire' => 'hot'}hash = {water: 'wet', fire: 'hot'} # シンボルリテラルをキーとする場合、Ruby 1.9 からはこのような Javascript 風の表記ができる。puts hash[:fire]       # 表示:  hothash.each do |key, value|
  puts "#{key} is #{value}"end# 表示:               water is wet#                     fire is hothash.delete_if {|key, value| key == :water}   # Deletes :water => 'wet'

制御構造

ほかの言語でもよくみられるような制御構造を用いることができる。
if "fablic".length > 3
  puts 'ya'else
  puts 'nop'end# 表示:         yalist = [1, 2, 5, 13, 21]for item in list
  puts itemend# 表示:         1#               2#               5#               13#               21n = 0while n < 3
  puts 'foobar'
  n += 1end# 表示:         foobar#               foobar#               foobar
一部の制御構造は後述するイテレータで代替することができる。

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

Ruby ではブロック付きメソッド呼び出しを用いるコードが好まれることが多い。これを用いると、ユーザー定義の制御構造やコールバックなど様々な処理を簡潔に記述できるからである。
ブロックとは波括弧 {、} または do、end によって囲まれたコード列のことである。メソッド呼び出しの末尾に記述することが出来る。この2つは基本的に同一だが、結合の優先度が異なる。一行で書くときは波括弧が、複数行に渡る場合はdo、endが使用される場合が多い。
# { ... }method1 { puts "Hello, World!" }# do ... endmethod2 do
  puts "Hello, world!"end
ブロック付きメソッド呼び出しが繰り返し処理を主な役割としていたことから、イテレータと呼ばれていた時期がある。しかし、実際には繰り返し処理にとどまらず、様々な使われ方をしているので、最近はブロック付きメソッド呼び出し全体の総称としてイテレータという名称を用いるのは適切でないと考えられている。

繰り返し処理

配列の各要素への繰り返し処理
list = [1, 2, 5, 13, 21]list.map! {|item| item * 2} # listの各要素を2倍する処理
以下はブロックを使わずに同じことを行う場合
list = [1, 2, 5, 13, 21]n = 0while n < list.length
  list[n] *= 2
  n += 1end
指定した回数の繰り返し処理
3.times { puts 'foobar' }       # 制御構造の項のwhileの例と同じ

後処理の省力化

ブロックの内容を実行してから、決められた後処理を行うメソッドもある
File.open('file.txt', 'w+b') do |file|
  file.puts 'Wrote some text.'end                             # file.txtはここで自動的に閉じられる
これは次の例と同様の処理を行う（ensure については例外処理の項を参照）
begin
  file = File.open('file.txt', 'w+b')
  file.puts 'Wrote some text.'ensure
  file.closeend

本処理を後から指定

実際に行いたい処理をブロックで記述する。前項の後処理の省力化もこれの一例といえる。
def bfs(list)       #配列をツリーに見立てた処理
  until list.empty?
    unit = list.shift
    yield unit      #ブロックの内容を実行
    unit.each{|v| list.push v} if defined? unit.push
  endendbfs([0,1,[2,3],4,[5,[6,7,8]],9]) {|v| p v}
この例は、ツリーから要素と分枝をつぎつぎと取り出して取り出したものになんらかの処理を行うものである。メソッドの利用者は、なんらかの処理のみを記述すればよく、取り出しのアルゴリズムなど、本質的でない内容に意識を向ける必要がなくなる。

クロージャ

クロージャとなるようなブロックの引数渡し
# オブジェクトのインスタンス変数（変数名の頭に@が付く）でブロックを記憶。def remember(&p)
  @block = pend# nameを受け取るブロックを引数に、上記のメソッドを呼び出す。remember {|name| puts "Hello, " + name + "!"}# 後に必要になった時点でクロージャを呼び出す。@block.call("John")# 表示:"Hello, John!"
メソッドからクロージャを返す例
def create_set_and_get(value = 0)
  return proc {|x| value = x}, proc { value }endsetter, getter = create_set_and_getsetter.call(21)getter.call # => 21

クラス

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

  def <=>(person)
    @age <=> person.age
  end

  def to_s
    "#{@name} (#{@age})"
  end

  attr_reader :name, :ageendgroup = [ Person.new("John", 20),
          Person.new("Markus", 63),
          Person.new("Ash", 16)
        ]puts group.sort.reverse
結果は3つの名前が年の大きい順に表示される
Markus (63)
John (20)
Ash (16)

例外処理

例外はなにか不具合が起こったときraiseの呼び出しで発生させることができる。Ruby での例外は Exception クラスか、そのサブクラスのインスタンスである。
例外にはメッセージを追加することもできる
 raise "This is a message"
さらに例外のタイプも指定できる
 raise ArgumentError, "Illegal arguments!"
例外はrescue節で処理することができ、次のようにコードにrescueを付加するだけである
begin
  # 通常処理rescue
  # 例外処理。引数を省略すると、StandardErrorのサブクラスの例外のみ処理するrescue SomeError
  # 例外処理。SomeErrorの例外のみ処理する。ensure
  # 例外の発生に関わらず必ず実行される処理else
  # 例外が発生しなかったときに実行される処理end

エピソード

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