情報科学概論
2001.6.19
コメントとはスクリプトの実行に関係ない文字列をスクリプト中に埋め込むことであり、通常は動作のあらましを書いておいたり、スクリプト名や著作権、バージョンの表示などを行う。エラーの解読のために#に続けて各行ごとに行番号を書く人もいるが、それは、
$ cat -n hoge.rb
のようにすると行番号が表示出来るので不要であるし、スクリプトが煩雑になり読みづらいのでお奨めできない。スクリプトが長くなって画面に収まりきらなければ、
$ cat -n hoge.rb | less
のようにページャにパイプで繋げれば自分でスペースキーや↑キーによりスクロールできるようになる。less の終了はQのキーを押すことにより可能である。
#で始まる行だけでなく、文の途中に#が現れると、そこから行末までがコメントとして認識される。また、実行動作の確認のために変数の値を表示するputsなどを一時的に入れておく場合に、不要になった段階で行頭に#を付けるような使い方もする。そのようにスクリプトの命令文をコメントにすることを「コメントアウト」と言うことがある。
変数やスクリプト名にこれら予約語を使用しない習慣を付けておく方が後々混乱が少なくて良い。また、初等関数と同じような変数名や、Linuxのコマンドなどと同じような変数名やファイル名も避ける方が無難である。日本語もとりあえず使わないでおくことを勧める。
ここで紹介されている字下げ、インデントは提出課題においても使用して欲しい。全体の見通しやここの制御構造の範囲の認識などに大きく貢献することは確実である。インデントの楽な使い方はこの後に紹介するXEmacsのRuby編集モードを参照のこと。
表2.1の結合の強さ一覧については一通り確かめておこう。自分で条件判断を行う際に、意図していない結果になったりした場合には関係があるかもしれない。初等数学の四則演算の結合の強さの様なものであるので、どの関係が最初に実行されるのかおおよその場合について把握しておくことは大切である。また、どのような言語においてもだいたい共通になっているので、Rubyを通して覚えておくのも役に立つ。
以前に学習したように、単一の=は等号としての意味はなく代入になるのが計算機言語の特徴である。(Pascalを除く)特に覚えておきたいのが自己代入という動作で、配列などを使用しないで順番に足しあわせていくことが可能になる。通常はループの中で使用し、例えば以下のように使用する。
ここで、sum += i というのは、sum = sum + i と同じ意味であり、簡略に表記しただけのものである。意味は、繰り返しになるが、sum という変数に i の値を加えたものを新たに sum という変数の値として保持する、と言うことである。上の例では、ループが i が0から10まで回るので、そのたびごとに i の値を加える、すなわち、0から10までの整数の和を求めることになる。
複数の変数や配列の要素を一度に複数まとめて操作するのに使用される代入が多重代入である。配列が多重になったりしても可能であるが、parseエラーが出ないように要素どうしの関係を良く確認する必要がある。
次の節に示される制御構文は条件式の真偽で実行を制御するようになっている。そのための概念として真偽値を把握しておく必要がある。また、正規表現のマッチなども真偽で判断する。
すでに何度か使用している制御構文であるが、より細かい使用法はこの節で学習する。if と組み合わせる else や elseif 、逆の使い方をする unless などが紹介されている。また、今まで使用していなかった case 文も紹介されている。if は基本的には真か偽の二つの分岐に対して条件判断を行うが、case の場合ははじめから何通りかの選択肢がある場合に対応付けを行うときに便利である。p.73のループ脱出などについては以下のような例を試してみると良い。
上記のスクリプトは入力データから一行ずつ読みとって作業するので、そのためのデータを用意する。ファイル名を break.txt とすると、中身が例えば以下のようなものであるとどのように動作するだろうか。
また、returnに関しては、かつて紹介した階乗の例のような使用法がある。
教科書p.63
XEmacsはEmacs-Lispという言語で記述することにより多彩なモードで便利に使用できる。通常のテキスト編集モードにおいても、カッコの対応付けなどを自動で検出してくれるのは知っていることだろう。教科書にあるように、Ruby用の設定ファイルを用意すれば、さらに便利にスクリプト作成が行える。以下に方法を紹介する。
まずはじめに行うのはruby-mode.elという設定ファイルの準備である。これは、
/usr/doc/ruby-1.4.5/misc/
ディレクトリにあるので、これを自分のホームディレクトリに用意した専用のディレクトリにコピーする。方法は、まず、ディレクトリを作成し、コピーである。ホームディレクトリにおいて、以下の作業を行う。
$ mkdir -p lib/emacs
$cp /usr/doc/ruby-1.4.5/misc/ruby-mode.el lib/emacs
これによりファイルが新たに作成した lib ディレクトリの中の emacs ディレクトリにコピーされた。次に、設定ファイルの編集である。エディタでホームディレクトリにある .xemacs.el を編集する。まず、以下の記述をファイルの最後の方の ;;; が2行にわたって並んでいる部分の上に加える。
(setq load-path (append '("~/lib/emacs") load-path))
続いて、教科書のp.63の下にある(require ... から ... interpreter-mode-alist))までを先ほどの行の下に加える。この後、Xemacsを起動して拡張子が .rbのファイルを読み込むとモードラインにRubyという表示が出て、Rubyの編集モードとなる。うまくいかなかった場合には記述のどこかが間違っているので、よく調べること。
先週までループと配列に関して復習をかねて基礎から学習し直すことを行った。今回は以前に行ったコマンドライン引数について実習してみる。
今日のwebテキストの例題では、break.rbでgetsを使用した。gets は与えられたデータを一行ずつ読み込むメソッドである。動作の際に、
$ ruby break.rb break.txt
の様にターミナルからコマンド操作を行うが、ここで、Rubyというコマンドに対する引数として二つのファイル名が指定されている。一つ目は break.rb というRubyスクリプトであり、このスクリプトをRubyによりどうさせる命令がこれでできあがっている。次に、break.txt というテキストファイルも引数として与えられている。これは、Rubyスクリプトが読み込むべきファイル名として与えられており、このファイルの中身を gets が一行ずつ読み込むことになる。
このように、ターミナルでコマンド操作を行う際に、コマンドラインにおいてある命令を行う際にそれに対して引数を付けることがあり、そのような引数をコマンドライン引数と呼ぶ。教科書のp.22にあるように ARGV という定数を用いてコマンドライン引数をより明示的に指定する方法もあるので、次はその例について考える。
上のスクリプトは二つの整数の最大公約数を求めるスクリプトである。使用法は、
$ ruby gcd.rb 30 45
のようにする。結局 gcd.rb と言うスクリプトはその後に続く二つをコマンドライン引数として受け取るが、 ARGV という定数(実は配列)がその二つを受け持って値を格納している。一番目の引数と二番目の引数は配列の要素を取り出すことにより得られるので、上記のようにして取り出した値を整数化して使用する。while ループを用いるとより一般化された記述も可能である。また、多重代入を利用すると a と b の両方の変数に一度に代入することも可能である。
先ほどのようにあらかじめあるファイルや行を読み込む gets を利用して ARGV を使わない方法と、上のように使用する方法とあるが、処理が実現できるのならどちらの方法でも構わない。例えば、gets を使う方法として以下のようなスクリプトの例もある。
この場合には動作をさせるやり方が少し異なる。スクリプトの起動は
$ ruby linegets.rb
とし、コマンドラインが改行されて入力待ちになるので、そこで、
30 45
のようにスペースで数字を区切って入力し、Enterキーを押す。すると処理が行われる。このように、gets と ARGV の使用法はその意味の違いを反映して異なっているので、そのときの都合に合わせてスクリプトを組めばよい。
作業1
作業2
先週まで、様々な例題を通して、Rubyスクリプトの基礎から応用まで一通り見てきた。今回からは文法という観点から再び個々の要素について復習しながらより深く学習していく。
教科書p.62
教科書p.62
教科書p.62
教科書p.64
教科書p.65sum = 0
for i in 0..10
sum += i
end
puts sum
教科書p.66なお、parseエラーとはカッコの数が開くのと閉じるのであっているか、変数の数は代入操作にちゃんと対応しているか、カンマや”はあっているか、ということを確認して不具合がある場合に表示されるエラーである。エラーが表示された番号の行にそのエラーがあることもあるが、それ以前からのカッコや end などの数の間違いがあると最終的につじつまが合わなくなったところでエラーが表示されているケースも多く、それ以前の行を良く確認する必要がある。
教科書p.67
教科書p.68#break.rb
while line = gets()
line.chomp!
next if line == "skip"
break if line == "quit"
print line
end
print "\n"
abc
def
ghi
skip
jkl
mno
skip
pqr
stu
vwxyz
quit
abc
#gcd.rb
a = ARGV[0].to_i
b = ARGV[1].to_i
while b != 0
r = a % b
a = b
b = r
end
printf "Greatest Common Divisor = %d\n", a
#linegets.rb
nuber = gets.split(/\s+/)
a = number[0].to_i
b = number[1].to_i
p a
p b
while b != 0
r = a % b
a = b
b = r
end
printf "Greatest Common Divisor = %d\n", a
教科書のスクリプト例を自分で試してみること。
webテキストに紹介した例も試してみること。
授業の終わり頃に次回までに提出する課題を発表するのでアナウンスに注意すること。また、発表されたら課題を表示するためには、一度このページを再読み込みする必要があるのでNetscapeのボタンをクリックする。そうしないと、課題のページは表示されない。
来週は、引き続き教科書の続きを行うとともに、コマンドライン引数と数値に関する復習を行う予定である。内容に関するリクエストなどがある場合には早めに申し出てもらえると対応できる場合もあるので、自分の分からない部分などを確認してみること。
トップに戻る