2. 基本的な文法

2.1. 文法の概要をざっと見る

公式リファレンス・マニュアルに沿って説明する。

  • 字句構造

  • プログラム・文・式

  • 変数と定数

    インスタンス変数、クラス変数、定数についてはオブジェクト指向のところで説明する。

  • リテラルはデータ構造のところで説明する。

  • 演算子式

    代入の「属性参照」はメソッド定義のところで説明する。

    「条件式としての範囲式」はわかりにくいので使わないほうがよい。

    「and を伴う式をメソッドの引数に渡す場合は二重に括弧が必要となります」について:

    • p(true and false) はエラーになる。 and の優先順位が低いので、 p(truefalse) の論理積と解釈される。

    • 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・ブロック付き・yield)

    super はオブジェクト指向のところで説明する(しないかもしれない)。

    ブロック付きメソッド呼び出しは別の週に説明する。

  • メソッド定義

    「識別子=」というメソッドを定義すると、代入のように見えるメソッド呼び出しになる。

課題 1

数値を入力して、次のように高さがその段数になるような三角形を表示せよ。

% ruby ex1.rb
4
   *
  ***
 *****
*******
  • 数値を入力するには、一行入力 gets と文字列から数値への変換 to_i をピリオドでつなぐ。

  • 文字列の出力には 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 が起きたら数値を再入力してやり直すようにせよ。

【解答例】