練習5-1の1.はex5-1.rb、2.はex5-2.rb、そして、練習5-2はex5-3.rbが
それぞれ回答例となる。ex5-1.rbでは年齢計算を「今日」との差をとった結果
(単位: 秒)を日単位に計算して、それを
365.2425で割って、整数部を取り出す floor
で結果を求めている。
d = Time.now - @birth_day
return (d / (60 * 60 * 24 * 365.2425)).floor
5-1の2.は計算方法が違うだけで、問題に書いた条件判定を素直に プログラムとして展開すれば良い。
def age time = Time.now a = time.year - @birth_day.year if time.mon < @birth_day.mon a = a - 1 elsif time.mon == @birth_day.mon if time.day < @birth_day.day a = a - 1 end end return a end
5-2については、ほぼそのまま書き下せば良いので、ここでは略す。
ex5-3.rbを見ると2つのクラス定義と実際に実行する主プログラムに相当する 部分が一体のファイルに納められている。小規模なプログラムではこのような書き方 でも問題ないが、例えば、ここで定義したクラスHumanを別のプログラム でも使用したい時などは、同じ定義をその別のファイルにも記述するのは無駄で あり、また後でHumanの定義に問題が見つかって修正する際、あちこちの ファイルに手を加えるという面倒なことになる。
一般的なプログラミング言語処理系では、プログラムを複数のファイルに分けて 記述し、コンパイルや実行する際などにそれらで関係するものをつなぎ合わせる 機構が備わっている。Rubyも例外ではない。
分割したプログラムをつなぎ合わせる機構は処理系の構築方式によって 異なるが、Rubyの場合はソースプログラム中に他のプログラムの読み込みを 指示するメソッドを記述することになっている。そのメソッドにはいくつかあるが、 ここではそのうち2つを紹介する。
「load(ファイル名)」を実行すると、指定したファイルを読み込み、
その中に記述されていたプログラムをあたかもそのloadが書いてある
ところに書かれていたかのように実行する。例えば、読み込ませたいプログラム
が「abc.rb」というファイルに格納されていれば、
load("abc.rb")
のように記述する。
loadを実行すると必ずそのファイルを読み込み、実行する。
「require(ファイル名)」(または「 require ファイル名」 と書かれることも多い)と記述し、loadと同様にプログラムを読み込み、 実行する。ただし、以下の点がloadと異なる。
requireは自分で作った他のプログラムを読み込むことにも
使えるが、システムにインストールされた拡張ライブラリを使用したい時にも
良く使われる。例えば、通常Rubyの処理系をインストールすると数多くの
拡張ライブラリが同時にインストールされるが、その中に Web
の CGI
プログラミングに役立つライブラリがある。それを使用する際は、
require("cgi")
とのみ記述する。すると、インストールされた場所のあるディレクトリの
cgi.rbを自動的に読み込む。
練習5-2で作成したプログラムを次のように3つのファイルに分割して、 実行してみよ。
rubyコマンドに与えて実行するのは3番目のファイル名のみで良い。
Rubyには、これまで紹介した他に様々なクラスが標準で組み込まれており、 また、プログラム開発の利便性のために有用なライブラリが標準で 添付されている。これらは、資料のページ に掲載している書籍類(特にオーム社の「プログラミングRuby」のライブラリ編) にも説明があるが、Web上にもマニュアルとして提供されている。
Rubyの公式サイトにオリジナルのマニュアルがあるが、利便性のために コピーを 本サイト上( http://www.sakalab.org/prog-ruby/においているので、 適宜活用されたい。
提供されているクラスやその機能を自分で探して、確認することは プログラミングにおいては必須のことなので、最初はわかりにくいかも 知れないが、人に聞く前に自分でまず読んでみるようにすること。
次のプログラム例は指定したファイルから1行ずつ読み込み、 画面に表示するものである(解説は口頭で行う)。
1 open(ファイル名){ |f| 2 begin 3 while true 4 line = f.readline 5 print(line) 6 end 7 rescue 8 end 9 }
by Tetsuo Sakaguchi
$Date: 2008/01/25 06:58:57 $(UTC)