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の紹介をしたいと思います。
