柔らかい春の風が吹く中,僕にはまだ現実が受け入れられなかった。彼女から暗号メールで突然の別れを告げられたものの,その後もメールのやり取りは続いていた。ただし,いずれの内容も,別れを希望したものだった。
唯一の希望は,彼女からの最後の暗号メールだった。解読した内容には,何か引っかかるものがある。それが何を意味するかはまだわからない。その“引っかかり”を解くにはもう少し気を落ち着かせる必要があるようだ。落ち着くために,Rubyについて思いを巡らせることにしよう。
RubyはRailsで普及した
この連載では,Rubyの主要な機能を紹介してきた。クラスの定義から始まり,「すべてがオブジェクト」という大きな特徴やオープンクラスと継承,例外処理までを説明してきた。これら以外にも,Rubyにはまだまだ面白い機能がたくさんある。本連載で語り尽くせないのが非常に残念だ。
最終回となる今回は,Rubyがどのようにして広く使われるようになったのか,そして,結局のところ,Rubyのどこがすばらしいのかについて,もう一度考えてみたい。
Rubyは1993年に誕生した。C/C++などに比べると,比較的新しいプログラミング言語だ。開発者は,日本人のまつもとゆきひろ氏である。
数年前までは,業務でRubyアプリケーションを利用することはなかなか想像できなかった。もちろん,個人レベルの便利なツールとしてRubyで作ったプログラムを使うことはあっただろう。しかし,企業情報システムの一部としてRubyアプリケーションを活用することは,少なくても僕の周りではほとんどなかった。
こうした状況を一変させたのが,Ruby on Rails(以下,Railsと呼ぶ)というWebアプリケーション開発用のフレームワークだ。Railsは,多くのプログラマに衝撃を与えた。なぜなら,簡単なアプリケーションであれば,コードを一切書くことなく,10分ほどで作成できてしまうからだ。たったの10分! 僕がパスタをゆであげるのと同じくらいの時間で,Webアプリケーションが完成してしまうのだ。
Railsの威力を知る
Railsは,Rubyが持つ力を徹底的に取り込んだツールといえる。
具体例を示そう。Railsでデータベース(DB)にアクセスするには,「ActiveRecord」というRails独自のDBアクセス用モジュール(ORM)を利用する。ActiveRecordは,一つのテーブルを一つのクラスとして表現する。
例えば,図1のEmpsという社員表があったとしよう。この表にアクセスするには,ActiveRecordではEmpクラスを作成する必要がある。EmpクラスをActiveRecordに従って作成すれば,
emp = Emp.find(id) #idによる社員の検索
puts emp.name #名前の表示
puts emp.role #役職の表示
というように,データベースへの検索結果がEmpのオブジェクト(emp)として取得できるようになる。検索だけでなく,データの作成や更新,削除をすべてEmpクラスで処理できる。それでは,Empクラスはどのように定義されているのかというと,
class Emp <ActiveRecord::Base
end
というたった2行だけだ。「ActiveRecord::Base」という親クラスを継承したEmpクラスを定義するだけで,図1の表にアクセスできる。
これは高機能な親クラスを継承しているためだが,ここで少し考えてほしい。先ほどのサンプル・コードでは,Empオブジェクト(emp)は,「name」と「role」というメソッドを持っていた。ところが,Empクラスの定義の中にはnameとroleという名前は一切入っていない。
では,親クラスであるActiveRecord::Baseがnameやroleといったメソッドを持っているのかというと,そうではない。nameとroleは,純粋にEmps表にある情報であり,当然親クラスのActiveRecord::Baseは,そのようなメソッドの存在を知らない。Rubyにおいては,定義されていないメソッドを呼び出すとエラーになってしまう。それでは,なぜエラーが起きないのだろうか?