2. 基本的な文法¶
2.1. 文法の概要をざっと見る¶
公式リファレンス・マニュアルに沿って説明する。
-
インスタンス変数、クラス変数、定数についてはオブジェクト指向のところで説明する。
リテラルはデータ構造のところで説明する。
-
代入の「属性参照」はメソッド定義のところで説明する。
「条件式としての範囲式」はわかりにくいので使わないほうがよい。
「and を伴う式をメソッドの引数に渡す場合は二重に括弧が必要となります」について:
p(true and false)はエラーになる。andの優先順位が低いので、p(trueとfalse)の論理積と解釈される。p (true and false)はOK。pの後に空白があると引数のカッコが省略されていると解釈する。
-
改行には区切り記号としての意味があるので注意。
これはOK
if x>0 puts "OK" end
これはエラー
if x>0 puts "OK" end
正しくは
if x>0 then puts "OK" end
-
superはオブジェクト指向のところで説明する(しないかもしれない)。ブロック付きメソッド呼び出しは別の週に説明する。
-
「識別子=」というメソッドを定義すると、代入のように見えるメソッド呼び出しになる。
課題 1
数値を入力して、次のように高さがその段数になるような三角形を表示せよ。
% ruby ex1.rb
4
*
***
*****
*******
文字列の出力には
print(改行なし)とputs(改行付き)を使う。print '*'とすると星を1個表示、print ' 'で空白を1個表示できる。1行分表示したらputsで改行。
【解答例】
課題 2
引数として数値を1個受け取り、それが素数なら true そうでなければ false を返すメソッド(関数) myprime を作れ。ただし、標準のPrimeクラスを使ってはいけない。
次に、 gets.to_i で数値を入力し、 myprime を呼び出して素数かどうか判定し、素数ならYes、素数でなければNoと出力するようにせよ。これはトップレベル(メソッド定義の外)で作れ。
注:2より小さい数値を入力した場合にどうするかは課題3でやるので、まだ考慮しなくてよい。
【解答例】
2.2. 例外処理¶
begin, end で囲んだ部分、またはメソッド定義の本体部分でエラーが起きた時、実行を停止せずに特別な処理を行うことができる。エラーが起きた時の処理は rescue の後に書く。
例えば、数値を二つ入力して、割り算の結果を表示するプログラムを考える。
x = gets.to_i
y = gets.to_i
puts x/y
しかし、 y に0を入力するとエラーになる。エラーを起こさずに別の処理をしたい場合は次のようにする。
begin
x = gets.to_i
y = gets.to_i
puts x/y
rescue ZeroDivisionError # 処理したいエラーの種類を指定する
puts "0では割れません。"
end
rescue の処理中で retry を使うと、もう一度やり直すことが出来る。
begin
x = gets.to_i
y = gets.to_i
puts x/y
rescue ZeroDivisionError
puts "0では割れません。もう一度入力してください。"
retry
end
エラーの種類については、 組み込みライブラリ の例外クラスのところを参照。
自分で例外を起こしたい場合は raise を使用する。
課題 3
さっきの素数判定プログラムで、 myprime は、引数が2より小さければ例外 RuntimeError を起こすようにせよ。
次に、トップレベル(メソッド定義の外)の myprime を呼び出しているところに rescue を書き、 RuntimeError が起きたら数値を再入力してやり直すようにせよ。
【解答例】