[目次] [第5回] [第7回]

Ruby勉強会(第6回)

練習5-1、5-2の回答例

練習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(ファイル名)」を実行すると、指定したファイルを読み込み、 その中に記述されていたプログラムをあたかもそのloadが書いてある ところに書かれていたかのように実行する。例えば、読み込ませたいプログラム が「abc.rb」というファイルに格納されていれば、
load("abc.rb")
のように記述する。

loadを実行すると必ずそのファイルを読み込み、実行する。

require

require(ファイル名)」(または「 require ファイル名」 と書かれることも多い)と記述し、loadと同様にプログラムを読み込み、 実行する。ただし、以下の点がloadと異なる。

  1. Rubyの実行開始から実行終了までの間に同じファイルは1度しか読み込ま ない。つまり、同じファイルを指定したrequireを何度も実行すると、 最初に実行した時のみ読み込まれ、2度目からは何もしない。
  2. 現在のディレクトリ以外に、Rubyであらかじめ準備されているクラス定義 などがあるディレクトリも含めてファイルを自動的に探す。これは システムにインストール済みのクラスライブラリを使う際のことを想定している。 また、そのためディレクトリ名は一般的に略される。
  3. 完全なファイル名でなくても、「.rb」などが略されていても 自動的に補完してファイルを探す。これはソースプログラム以外の拡張 ライブラリを用いることが想定されている。

requireは自分で作った他のプログラムを読み込むことにも 使えるが、システムにインストールされた拡張ライブラリを使用したい時にも 良く使われる。例えば、通常Rubyの処理系をインストールすると数多くの 拡張ライブラリが同時にインストールされるが、その中に Web の CGI プログラミングに役立つライブラリがある。それを使用する際は、
require("cgi")
とのみ記述する。すると、インストールされた場所のあるディレクトリの cgi.rbを自動的に読み込む。

練習6-1

練習5-2で作成したプログラムを次のように3つのファイルに分割して、 実行してみよ。

rubyコマンドに与えて実行するのは3番目のファイル名のみで良い。

組み込みクラスや標準で添付されているライブラリ

Rubyには、これまで紹介した他に様々なクラスが標準で組み込まれており、 また、プログラム開発の利便性のために有用なライブラリが標準で 添付されている。これらは、資料のページ に掲載している書籍類(特にオーム社の「プログラミングRuby」のライブラリ編) にも説明があるが、Web上にもマニュアルとして提供されている。

Rubyの公式サイトにオリジナルのマニュアルがあるが、利便性のために コピーを 本サイト上( http://www.sakalab.org/prog-ruby/においているので、 適宜活用されたい。

提供されているクラスやその機能を自分で探して、確認することは プログラミングにおいては必須のことなので、最初はわかりにくいかも 知れないが、人に聞く前に自分でまず読んでみるようにすること。

練習6-2

次のプログラム例は指定したファイルから1行ずつ読み込み、 画面に表示するものである(解説は口頭で行う)。

     1  open(ファイル名){ |f|
     2      begin
     3          while true
     4              line = f.readline
     5              print(line)
     6          end
     7      rescue
     8      end
     9  }
  1. ファイル名に適当なテキスト(今まで入力したプログラムでも 良い)のファイル名を指定して、このプログラムを実行してみよ。
  2. ある添付ライブラリを用いると、このプログラムをほとんど 変えずに、ファイル名のところに URLを指定すればその Webページのデータを読み込んで画面に表示するものとなる。 上で述べたマニュアルの添付ライブラリの項や書籍類を調べて、 その添付ライブラリを使用して、Webページのデータを 表示してみよ。

[目次] [第5回] [第7回]

by Tetsuo Sakaguchi
$Date: 2008/01/25 06:58:57 $(UTC)