yusukeです。前回のRuby【初級編】の続きを書きたいと思います。
目次
- クラス(クラスメソッドとクラス変数)
- 継承
- モジュール
- 例外処理
前回はクラスを作り、インスタンスメソッドを使うところまでを記載しました。今回はクラスメソッドの書き方から始めたいと思います。
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の紹介をしたいと思います。