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