アマグラミング

プログラミング初心者が勉強したことを復習とメモがてら書いているだけです。

(95)rescue修飾子

ifやunless修飾子のように、rescueにも修飾子がある。

 

式1 resucue  式2

の形を取る

 

1や2というのは

begin

式1

rescue

式2

end

 

こういうこと

つまり最初の式は例外を発生させると思われる式の方。

 

 

(94)retry

rescue節でretryを用いると処理をもう一度やり直せます。

しかし、何度やっても同じ場合、無限ループになりますので、

そうならないように注意すること。

 

(93)後処理

例外のあるなしにかかわらず、実行したい処理がある場合には、

ensure節に後処理を記述します。

 

begin

  例外を発生させると思われる処理

rescue

  例外が起こった場合の処理

ensure

  例外あるなしにかかわらずに実行する処理

end

 

 

 

(92)例外処理

プログラムを実行するとエラーが起こり、例外が発生することがあります。

その場合、プログラムは一時中断して、例外処理を探します。

 

もし、例外処理が記述されていれば、それを実行します。

なければ、エラーメッセージが表示されて

 

ファイル名:行番号:in メソッド名:エラーメッセージ(例外クラス名)

from ファイル:行番号:in メソッド名

・・・

・・・

・・・

 

こんな感じの内容のエラーメッセージが出る。

 

例外処理の書き方

 

begin

  例外を発生させると思われる処理

rescue

  例外が起こった場合の処理

end

 

例外処理もオブジェクトなので

rescue 変数名 という形で使える

 

begin

例外を発生させると思われる処理

rescue => 代入する例外オブジェクトの変数

例外が起こった場合の処理

end

 

変数名は指定しなくても変数$!に自動的に当てはめられるが

明示的に指定する書き方の方がわかりやすい。

 

$!  は最後に発生した例外(例外オブジェクト)

$@ は最後に発生した例題の位置情報

 

例外オブジェクトのメソッドとしては

class は例外の種類

message は例外のメッセージ

backtrance は例外の発生した位置に関する情報

 

例外が発生したメソッド中にない場合、呼び出し元を遡って例外処理を探します。

例えば、aというメソッドをbというメソッドを用いて呼び出した時

aでエラーが発生したとします。

aで例外処理が書かれていなくても、bで例外処理が書いてあれば

それを実行するということです

 

 

 

(91)モジュールの持つ名前空間

名前空間とは、メソッドや定数、クラスなどを区別して管理する単位。

モジュールは独立した名前空間を提供する。

 

例えばAとBのモジュールがあったとして、

それぞれにhogeというメソッドがあるとする。

だけどそれぞれは別のhogeメソッドとして扱われる。

 

定数の場合も同様。

 

メソッドにしてもクラスにしても定数にしても、

簡潔なほうが楽だけど、一般的になればなるほど、

既に使われていて混乱をきたすこともある。

 

モジュールの内部で名前を定義すれば、避けられる。

 

モジュールの提供するメソッドは、

モジュール名.メソッド名

で参照するけど、

これをモジュール関数という。

 

(90)特異クラス、特異メソッド

class << クラス名 ~ ...end

この書き方のクラス定義を特異クラス定義という。

これで定義したメソッドを特異メソッドという。

 

特異メソッドは任意のオブジェクトだけに利用できる。

 

ちょっと書いてみる。

 

yosuke = "よう"

yukiko = "おはよう"

 

class << yukiko

def aisatsu

"鳴神くん、#{self}"

end

end

 

p yosuke.aisatsu

p yukiko.aisatsu

 

これを実行すると

まずyousukeはエラーが起こる、そんなメソッド対応してないから。

p yosukeの行を削除する

 

で再度実行

f:id:tiroru17:20170715033805p:plain

yukikoのほうは特異メソッドを使ってできている。

 

 

(89)aliasとundef

既に存在するメソッドに別の名前を割り当てたい場合にaliasを使うこともある。

書き方としては

alias 割り当てたいメソッド名 元のメソッド名

もしくは

alias : 割り当てたいメソッド名 :元のメソッド名

シンボルを使ってこう書く

 

同じ機能を持つものを複数使う場合や既にあるメソッドの定義を

変更する時に元のメソッドを保存しておくことにも使える。

 

ちょっと書いてみる

 

class Persona4

 def chie

"あちょー"

end

end

 

class Persona5 < Persona4

alias hutaba chie

 

def chie

 

 "おじゃまするます"

end

end

 

persona = Persona5.new

p persona.hutaba

p persona.chie

 

実行すると

f:id:tiroru17:20170715024952p:plain

 

こんな感じに動く

 

undefは定義されたメソッドをなかったコトにしたい時に使う。

書き方としては

undef  メソッド名

undef  :メソッド名

シンボル使うとこんな感じ。

 

スーパークラスを継承するとき、いらないメソッドを

削除するなどの用途で使う。