連載
» 2016年04月12日 05時00分 UPDATE

Dev Basics/Keyword:Ruby(プログラミング言語)

Rubyは、まつもとゆきひろ氏(Matz)が開発した日本発のオブジェクト指向スクリプト言語。楽しくプログラミングできることがモットーだ。

[かわさきしんじ,Insider.NET編集部]
Dev Basics/Keyword
Insider.NET

 

「Dev Basics/Keyword」のインデックス

連載目次

 Rubyは、まつもとゆきひろ氏(Matz)が開発した日本発のオブジェクト指向スクリプト言語。「Enjoy programming」をモットーとし、プログラマーがストレスを感じることなく楽しんでプログラミングできることが、その美点の1つとなっている。

Ruby公式サイト Ruby公式サイト

 プログラマーからの人気はもともと高かったが、2004年にWebアプリ開発用フレームワークであるRuby on Railsが登場したことで、その人気はより一層高いものとなった(が、本稿ではRuby on Railsについては触れない)。

Rubyの特徴

 「オブジェクト指向スクリプト言語 Ruby リファレンスマニュアル」の「はじめに」からRubyの特徴を幾つか挙げる。

  • 全てがオブジェクト
  • 変数宣言が不要
  • 単純な文法
  • 特異メソッド
  • モジュールによるMix-in
  • ブロック付きメソッド呼び出し
  • クロージャ

 この中から幾つかの要素を見ていこう。

全てがオブジェクト

 Rubyでは全てがオブジェクトとして表現されている。例えば、整数はFixnumクラスあるいはBignumクラスのオブジェクトであり、次のような記述が可能だ。

# timesメソッド呼び出し
5.times do
  puts "hello ruby"
end

整数に対するメソッド呼び出し

 整数だけではなく、クラスですらオブジェクトとして表現される。

class Foo
  …… 省略 ……
end

f = Foo.new
puts f.class # 出力結果: Foo
puts Foo.class # 出力結果: Class

FooクラスはClassクラスのインスタンス

 このように、RubyではあらゆるものがObjectクラス(正確にはBasicObjectクラス)を頂点とした階層構造の下に表現され、これらを統一的に扱えるようになっている。

 なお、上で見た「5.times」はIntegerクラスのtimesメソッド呼び出しだ。Rubyでは多くの場面でメソッド呼び出し時のかっこを省略できる。これはRubyコードの見た目の簡潔さに大きく寄与している。

変数宣言が不要

 Rubyでは変数や定数は宣言なしに使用できる。また、その変数/定数の種類(ローカル変数/インスタンス変数/クラス変数/グローバル変数/定数など)は変数名からすぐに分かるようになっている。

  • ローカル変数: 英小文字またはアンダースコアで始まる
  • インスタンス変数: @で始まる
  • クラス変数: @@で始まる
  • グローバル変数: $で始まる
  • 定数: 英大文字で始まる

 このような命名規約があることで、変数/定数がどんな種類かが一目で分かるようになっている。

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

 Rubyでは「ブロック付きメソッド呼び出し」がプログラムのさまざまな箇所で使われる。ブロックとは何らかの処理の固まりのことで、上で見た「times」メソッドなど、Rubyでは多くのメソッドがその呼び出し時にブロックを受け付けるようになっている。もともとは、繰り返し処理をきれいな形で書くために使われることが多かったが(そのため「イテレータ」と呼ばれていた)、現在ではそれ以外の目的でもよく使われている。

 ブロック付きメソッド呼び出しによる繰り返し処理の例を示す。先ほどの「5.times」メソッド呼び出しではdo〜endでブロックを表したが、{}を使ってもよい(1行で済む程度の簡潔なコードは{}を、ある程度のロジックを含み、インデントを伴ったコードを書きたい場合にはdo〜endを使うのが一般的だ)。

array = [1, 2, 3, 4]
array.each { |item| puts item * 2 }

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

 これは配列arrayのeachメソッドにブロックを渡して、各要素に対して反復処理を行っている(これはmapメソッドを使い「array.map { |item| puts item * 2}」のようにも記述できる)。

 一方、ブロックは定型処理を隠蔽するのにも使える。以下に例を示す。

File.open("./foo.txt") { |file|
  file.each_line { |line|
    puts line
  }
}

ブロック付きメソッド呼び出しを使うことで、ファイルのクローズ処理を忘れずに行える

 ここではブロックを二重に使用しているが、何をしているかはすぐに分かるはずだ(この例はC#における「using」ステートメントと同様なものだと考えれば分かりやすいだろう)。

 このように、ブロック付きメソッド呼び出しを使うことで、Rubyでは簡潔にさまざまな処理を記述できるようになっている。

多様性は善

 Rubyは同じくスクリプト言語であるPerlから多くのものを引き継いでいる。その1つが「やり方は1つではない」(There's More Than One Way To Do It)というキーワードだ(これはPythonにおける「何かをする方法が1つ(できれば1つだけ)存在する」という思想とは相反するものだ)。「多様性は善」もこうした考え方を表すフレーズだ。

 Rubyでは、if文に対するunless文、if修飾子/unless修飾子、whileループに対するuntilループなどの構文が用意されていて、同じことであっても、さまざまな形でコードを記述できるようになっている。最終的に1つのコードへと収束することはあっても、その過程におけるプログラマーの思考はさまざまであり、こうした構文要素を使ってダイレクトにコードに表現できる言語がRubyだといえる。


 Rubyは、プログラマーがシンプルに、かつ楽しくコーディングできる言語となっている。また、そこからはプログラマーを助ける多くのツールやフレームワーク、新たな概念も生まれている。例えば、本稿では説明しきれなかったが「ダックタイピング」(異なるクラスのオブジェクトであっても、ある処理を行うための同一のインタフェースを持つのであれば、それらは同一のものと見なしてよいという考え方)などはRubyから生まれ、現在ではRuby以外の世界でも広く使われるようになった概念だ。

参考資料


「Dev Basics/Keyword」のインデックス

Dev Basics/Keyword

Copyright© 1999-2017 Digital Advantage Corp. All Rights Reserved.

@IT Special

- PR -

TechTargetジャパン

この記事に関連するホワイトペーパー

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。