- 本日の作業内容
- 出席確認
電子メールで出席確認をします.宛先など以下の情報を用いてメールを作成し,
出席申告してください.なお,キーワードは授業中に紹介します.
提出形式
宛先 |
justice@mag.shimane-u.ac.jp |
件名 |
AttendR01-28_ruby_s0340** |
本文 |
学生番号
氏名
キーワード
|
(改行) (改行)
キーワードは授業中に紹介 |
注意 |
「件名」および「添付書類名」の**をそのままにしないで,必ず自分の学生番号
に修正して下さい.また,ABクラス別は指示にしたがって下さい.
|
- エラーメッセージの意味
プログラミングの作業において,間違いをしないでプログラミングを行うことは
ほとんどありません.文法や定義の間違いをしたときには,通常は,プログラミ
ング言語の方でなんらかのヒントを与えてくれるようになっています.それが,
「エラーメッセージ」なのですが,それを有効に活用していないケースが多く見
られるようです.Rubyにおいては,メッセージが英語で表示されていることから,
それだけで拒絶反応を起こしている人が多いように見えるのが残念ですし,もっ
たいないことです.ここでは,メッセージが教えてくれているエラーについてい
くつかの例を挙げておきますので,参考にしてください.
- Parseエラー
次の例は対になっているはずのものが,不完全であるためにエラーが発生するも
のです.
for i in 0..5
for j in 0..5
puts i, j
end
p 1
p 2
|
上の例をS@pphireで実行した場合には,次のようなエラーメッセージが表示されます.
このメッセージで注意が必要なのは,表示されている行数です.ファイル名の次
に表示されているのは,エラーが発生した行数です.自分の目で見てみると,当
然ですが4行目で不自然に for ループが終わっていることが原因だと
分かります.しかし,プログラミング環境としては,内側のループが正常に閉じ
ているのに,外側のループがいつまでたっても終わらないために,最後の行で
end が無いことを警告する意味で7行目となっています.
次の例も注意が必要です.
str = "abc"
print str, "defghi\n
a = str
b = str
print "jkl", a, b
|
ここでも,間違いは3行目の二重引用符のつけ忘れです.ところが,エラーメッ
セージは,
tmp.rb:8: parse error
print "jkl", a, b
^
|
となります.理由は先ほどの例と同じで,対になったものが不完全であることが
判明するのが,最終的に最後に登場した部分であることです.ですので,このよ
うなParseエラーには,メッセージの行数にも注意が必要であることを忘れない
で下さい.
- 初期化エラー
まずは,次のスクリプトを見てみましょう.
a = 1
b = 2
for i in 0..5
c += a + b
end
p c
|
これを実行すると,次のようなエラーメッセージが表示されます.
tmp.rb:5: undefined method `+' for nil (NameError)
from tmp.rb:4:in `each'
from tmp.rb:4
|
メッセージをそのまま訳すと,「nil(無いもの)に対して+という演算(メソッド)
は定義されていない」となります.要は,まだ c という変数が初期化
されていないので,それに対して何かの演算は実行できない,ということです.
while ループでのカウンタ変数の未定義や配列を用いた処理の
の配列の要素が未定義の場合などに発生します.これが出てきたら,とり
あえず,初期化されていない変数や配列の要素を探して修正して下さい.
もう一つ,初期化に関しては違うエラーもあります.次の
例を見てみましょう.
この場合のメッセージは先ほどとは異なり,次のようなものになります.
tmp.rb:1: undefined local variable or method `array' for # (NameError)
|
この場合,オブジェクトとして認識されているアドレスの部分は実行ごとに異な
るものですので,気にしないで下さい.配列の値を代入したくても,配列が定義
されていないと上のようにエラーになります.
- タイプエラー
型の違いに関するエラーメッセージについては,次のような
場合が代表的です.
str = "abc"
num = 5
p str + num
|
エラーは以下のようになります.
tmp.rb:4:in `+': failed to convert Fixnum into String (TypeError)
from tmp.rb:4
|
直訳は,「+という演算において,数値クラスの値を文字列クラスの値に変換する
ことに失敗した」となります.型が異なるものを処理する場合には注意が必要で
すが,間違いがあった場合にはこのようにメッセージで表示してくれます.
- 条件式
次の例も起こしやすい間違いです.
a = rand(10)
if a = 5
print "OK!\n"
end
|
エラーメッセージは非常に分かりやすいものになっていますので,意味は自分で
も分かると思います.
if.rb:5: warning: found = in conditional, should be ==
OK!
|
このエラーメッセージはエラーではなく,警告です.動作はしていますが,正し
い動作では無いので警告がはっせされているということです.
- 新規配列の作成法
配列を用いた繰りかえし処理のときに,あらかじめ配列を定義しておく必要があ
りますが,簡単な
が使える場合は楽ですけれど,前回試したように,そうではない場合もあります.そこで,初期値を
持つ配列や多重の空の配列を作る方法を紹介しておきましょう.これらの方法を
使うと初期化がかなり楽になります.
ary1 = Array.new(10,0)
ary2 = []
for i in 0..10
ary2[i] = Array.new(5)
end
p ary1, ary2
|
この方法では,オブジェクト指向言語に特有の「クラス」を意識しています.数
式を扱う際に
のように大文字で始まる数学クラス Math を呼び出しました.これと
同じようなことがここで大文字で始まる Array というクラスの指定で
す.新規にオブジェクトを作成するメソッドの new を作用させること
で新しく配列を作ります.カッコの中の引数は要素の個数が入りますが,もう一
つ引数をつけるとそれが初期値になります.動作は上の例を参考にしてみて下さ
い.
- 演習
配列を扱うことは慣れるまで難しく感じるものです.たくさんの例を試すことが
一番ですので,ここでもいくつか試して行きましょう.難しいものが多くなりま
すので,後程解答例を紹介するときには,しっかりと確認して下さい.
- 6つの数字を予想して大金獲得を狙うタイプの富くじに
Loto6があることはみなさん御存じでしょう.1から43までの数字をラ
ンダムに発生させるスクリプトを自分で考えてみましょう.ここで問題に
なるのは同じ数字は2度と使えないために重複を避ける操作が必要なこと
です.
解答例
- これまで何度も乱数を扱ってきました.そして,サイコロの動作をシミュレー
トするようなスクリプトもつくってきました.ここでは,その乱数が本当
にランダムなのか,試してみることにしましょう.while ループ
を使ってサイコロの目のそれぞれの出る確率が1/6ずつになるまでサイコロ
を振って何回目でなるのか調べるスクリプトを考えてみましょう.
解答例
- 小テスト
授業の終わりに小テストを実施します.アナウンスに注意していて下さい.
再履修クラス小テスト
- 宿題
宿題に関する案内が授業の終わりに紹介されます.注意にしたがって提出してく
ださい.
再履修クラス宿題
- 本日の用語