Ruby モジュールと例外処理【応用編】


yusukeです。前回のRuby【初級編】の続きを書きたいと思います。

目次

  1. クラス(クラスメソッドとクラス変数)
  2. 継承
  3. モジュール
  4. 例外処理

前回はクラスを作り、インスタンスメソッドを使うところまでを記載しました。今回はクラスメソッドの書き方から始めたいと思います。

1. クラスメソッドとクラス変数

class EnglishTest
#クラスメソッド
=begin
def クラス名(もしくはself).メソッド名
  実行したい処理
end
=end
  def EnglishTest.title(title)
    print title,"テストの点数を発表します。\n"
  end
end
#クラスメソッドの呼び出し
EnglishTest.title("英語")

クラスメソッドは、def クラス名(もしくはself).メソッド ~ endで表します。クラスメソッドを呼び出すには「クラス名.メソッド名」と書きます。

複数のクラスメソッドを纏める書き方もあります。

class EnglishTest
#発表した人数をカウント
  @@count=0

#初期化メソッド
  def initialize(name="Ruby",point=0)
    @name=name  
    @point=point
  end
#アクセスメソッド
  attr_reader :name,:point
  
#インスタンスメソッド
  def test
   @@count+=1
   print(@name,"さんの点数は",@point,"点\n") #()省略可
  end
 
#クラスメソッド
  class << EnglishTest
    def title(title)
      print title,"テストの点数を発表します。\n"
    end

    def count
      @@count
    end
  end
end

#クラスメソッドの呼び出し
EnglishTest.title("英語")

#オブジェクトの生成
ruby=EnglishTest.new
tanaka=EnglishTest.new("田中",60)
takahashi=EnglishTest.new("高橋",80)
#メソッド呼び出し
ruby.test
tanaka.test
takahashi.test
#クラス変数の呼び出し
puts EnglishTest.count,"人の点数を発表しました。\n"

クラスメソッドを複数書く場合はclass << EnglishTest ~ endの中に書きます。インスタンスメソッドと同じような書き方ができ、わかりやすくなります。

@@で始まる変数はクラス変数と呼ばれるものです。このクラスのすべてのインスタンスで共有できる変数です。クラス変数を参照するには自分でアクセスメソッドを用意しなければいけません。上記ではtestメソッドが呼び出される回数を記録しています。

以下は実行結果です。

英語テストの点数を発表します。
Rubyさんの点数は0点
田中さんの点数は60点
高橋さんの点数は80点
3
人の点数を発表しました。

 

2. 継承

class Human
  def initialize(name="you")
    @name=name
  end

  def morning
    print "おはよう\n"
  end

  def hello
    print "こんにちは, ", @name,"さん\n"
  end 
end

#継承の構文
#class クラス名 < スーパークラス ~ end
class John < Human
  def morning
    print "Goodmorning\n"
  end
  
  def bye
     print "Goodbye\n"
 end
end

john=John.new("John")
john.morning
john.hello
john.bye

スーパクラスがHuman,サブクラスがJohnになります。スーパークラスのmorningメソッドをサブクラスのmorningメソッドでオーバーライド(上書き)し、サブクラスで新しいbyeメソッドを追加しています。スーパークラスのinitializeとhelloメソッドはサブクラスには記載されていませんが、継承されているので、呼び出すことができます。

Goodmorning
こんにちは, Johnさん
Goodbye

 

3. モジュール

モジュールはクラスと書き方が似ていますが、クラスと違いインスタンスを持つことができません。また継承もできません。処理だけを纏める機能を持ちます。以下のように記載します。

#モジュール作成
=begin
構文
module モジュール名
  モジュールの定義
end
=end

module AbcModule
 Number="1.0"  #定数

 def hello(name)
 print name,"さん、こんにちは\n"
 end 
#モジュール関数として登録
 module_function :hello
end

p AbcModule::Number
AbcModule.hello("John")

include AbcModule
p Number
hello("Sara")

モジュールは「モジュール名.メソッド名」という形で参照できます。これをモジュール関数といいます。注意しなければいけないのは、モジュール関数を定義しただけでは、モジュール名.メソッド名で呼び出せません。module_functionでモジュール関数を外部に公開して呼び出せるようになります。

モジュールをincludeすることによって、モジュール名を省略することができます。

"1.0"
Jognさん、こんにちは
"1.0"
Saraさん、こんにちは

モジュールをクラスにインクルードすることを「Mix-in」とよびます。モジュール内のメソッドなどをクラスに取り込むことができます。

module AbcModule
  #Class1とClass2で共通のメソッドをまとめる
end

class Class1
  include AbcModule
  #固有のメソッドを記載
end

class Class2
  include AbcModule
  #固有のメソッドを記載
end

 

4. 例外処理

プログラム実行で起きるエラーは以下のものがあります。

  • データのエラー
  • システムのエラー
  • プログラムのエラー

例外処理はこのようなエラーが発生した際に、実行されます。今回はraiseメソッドを使って、自分で例外を発生させます。

class ErrorTest
=begin
  begin
    例外が発生するかもしれない処理
  rescue
    例外が発生した際の処理
  end
=end  
  def initialize(name)
    @name=name
  end
 
  def hello
    begin
      raise
      print @name,"\n"
    rescue
      print "エラーが発生しました。\n"
    end
  end  
end

john=ErrorTest.new("John")
john.hello

 

例外処理は、begin~rescue~endを使います。beginに例外が発生するかもしれない処理を書き、rescueに例外が発生した際の処理を書きます。

上記では例外が発生するかもしれない処理の中でまずraiseメソッドが呼ばれ、その後printメソッドが呼ばれています。しかしraiseメソッドは例外を起こすメソッドなので、このメソッドが呼ばれた時点でrescueに処理が移ります。処理が移ったので、rescue側のprintメソッドが呼ばれ、以下が実行結果として出力されます。

エラーが発生しました。

 

早足でRubyを紹介してきましたが、いかがでしたでしょうか?
Rubyが気になった方は是非、開発環境を整えて、コードを書いてみてください。
次回はRubyのフレームワークであるRailsの紹介をしたいと思います。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>